{"version":3,"file":"index.cjs","names":["Visitor","isToken","isParseResult","isWhitespaceNode","getNodesBeforePosition","getNodesAfterPosition","sliceBetweenPositions","filterNodes","ERBContentNode","isERBOutputNode","isERBIfNode","isERBUnlessNode","isERBElseNode","isHTMLTextNode"],"sources":["../src/print-context.ts","../src/printer.ts","../src/identity-printer.ts","../src/indentation.ts","../src/indent-printer.ts","../src/erb-to-ruby-string-printer.ts"],"sourcesContent":["export class PrintContext {\n  private output: string = \"\"\n  private indentLevel: number = 0\n  private currentColumn: number = 0\n  private preserveStack: string[] = []\n\n  /**\n   * Write text to the output\n   */\n  write(text: string): void {\n    this.output += text\n    this.currentColumn += text.length\n  }\n\n  /**\n   * Write text and update column tracking for newlines\n   */\n  writeWithColumnTracking(text: string): void {\n    this.output += text\n\n    const lines = text.split('\\n')\n\n    if (lines.length > 1) {\n      this.currentColumn = lines[lines.length - 1].length\n    } else {\n      this.currentColumn += text.length\n    }\n  }\n\n  /**\n   * Increase indentation level\n   */\n  indent(): void {\n    this.indentLevel++\n  }\n\n  /**\n   * Decrease indentation level\n   */\n  dedent(): void {\n    if (this.indentLevel > 0) {\n      this.indentLevel--\n    }\n  }\n\n  /**\n   * Enter a tag that may preserve whitespace\n   */\n  enterTag(tagName: string): void {\n    this.preserveStack.push(tagName.toLowerCase())\n  }\n\n  /**\n   * Exit the current tag\n   */\n  exitTag(): void {\n    this.preserveStack.pop()\n  }\n\n  /**\n   * Check if the output written so far ends with a whitespace character\n   */\n  endsWithWhitespace(): boolean {\n    return /\\s$/.test(this.output)\n  }\n\n  /**\n   * Check if we're at the start of a line\n   */\n  isAtStartOfLine(): boolean {\n    return this.currentColumn === 0\n  }\n\n  /**\n   * Get current indentation level\n   */\n  getCurrentIndentLevel(): number {\n    return this.indentLevel\n  }\n\n  /**\n   * Get current column position\n   */\n  getCurrentColumn(): number {\n    return this.currentColumn\n  }\n\n  /**\n   * Get the current tag stack (for debugging)\n   */\n  getTagStack(): string[] {\n    return [...this.preserveStack]\n  }\n\n  /**\n   * Get the complete output string\n   */\n  getOutput(): string {\n    return this.output\n  }\n\n  /**\n   * Reset the context for reuse\n   */\n  reset(): void {\n    this.output = \"\"\n    this.indentLevel = 0\n    this.currentColumn = 0\n    this.preserveStack = []\n  }\n}\n","import { Node, Visitor, Token, ParseResult } from \"@herb-tools/core\"\nimport { PrintContext } from \"./print-context.js\"\n\nimport { isToken, isParseResult } from \"@herb-tools/core\"\n\nimport type { NotLocationless } from \"@herb-tools/core\"\n\n/**\n * Options for controlling the printing behavior\n */\nexport type PrintOptions = {\n  /**\n   * When true, allows printing nodes that have parse errors.\n   * When false (default), throws an error if attempting to print nodes with errors.\n   * @default false\n   */\n  ignoreErrors: boolean\n}\n\n/**\n * Default print options used when none are provided\n */\nexport const DEFAULT_PRINT_OPTIONS: PrintOptions = {\n  ignoreErrors: false\n}\n\nexport abstract class Printer extends Visitor {\n  protected context: PrintContext = new PrintContext()\n\n  /**\n   * Static method to print a node without creating an instance\n   *\n   * @param input - The AST Node, Token, or ParseResult to print\n   * @param options - Print options to control behavior\n   * @returns The printed string representation of the input\n   * @throws {Error} When node has parse errors and ignoreErrors is false\n   */\n  static print(input: (Token | Node | ParseResult | Node[]) & NotLocationless | undefined | null, options: PrintOptions = DEFAULT_PRINT_OPTIONS): string {\n    const printer = new (this as any)()\n\n    return printer.print(input, options)\n  }\n\n  /**\n   * Print a node, token, or parse result to a string\n   *\n   * @param input - The AST Node, Token, or ParseResult to print\n   * @param options - Print options to control behavior\n   * @returns The printed string representation of the input\n   * @throws {Error} When node has parse errors and ignoreErrors is false\n   */\n  print(input: (Token | Node | ParseResult | Node[]) & NotLocationless | undefined | null, options: PrintOptions = DEFAULT_PRINT_OPTIONS): string {\n    if (!input) return \"\"\n\n    if (isToken(input)) {\n      return input.value\n    }\n\n    if (Array.isArray(input)) {\n      this.context.reset()\n      input.forEach(node => this.visit(node))\n      return this.context.getOutput()\n    }\n\n    const node: Node = isParseResult(input) ? input.value : input\n\n    const trackedLocations = isParseResult(input) ? input.options.track_locations : node.location !== null && node.location !== undefined\n\n    if (!trackedLocations) {\n      throw new Error(`Cannot print the node (${node.type}) since it was parsed with \\`track_locations: false\\`. The printer needs source locations, so re-parse the source with \\`track_locations: true\\`.`)\n    }\n\n    const hasErrors = isParseResult(input) ? input.errorCount !== 0 : true\n\n    if (options.ignoreErrors === false && hasErrors && node.recursiveErrors().length > 0) {\n      throw new Error(`Cannot print the node (${node.type}) since it or any of its children has parse errors. Either pass in a valid Node or call \\`print()\\` using \\`print(node, { ignoreErrors: true })\\``)\n    }\n\n    this.context.reset()\n\n    this.visit(node)\n\n    return this.context.getOutput()\n  }\n\n  protected write(content: string | null | undefined): void {\n    if (content !== null && content !== undefined) {\n      this.context.write(content)\n    }\n  }\n}\n","import { Printer } from \"./printer.js\"\nimport { getNodesBeforePosition, getNodesAfterPosition, isWhitespaceNode, sliceBetweenPositions } from \"@herb-tools/core\"\n\nimport type * as Nodes from \"@herb-tools/core\"\n\n/**\n * IdentityPrinter - Provides lossless reconstruction of the original source\n *\n * This printer aims to reconstruct the original input as faithfully as possible,\n * preserving all whitespace, formatting, and structure. It's useful for:\n * - Testing parser accuracy (input should equal output)\n * - Baseline printing before applying transformations\n * - Verifying AST round-trip fidelity\n *\n * A byte-exact round-trip requires a tree parsed with `track_whitespace: true`, since that is\n * the only mode in which every whitespace token is represented by a node. Without it the\n * whitespace separating the parts of an open tag is recovered from the source the nodes were\n * parsed from, and falls back to a single separating space when that source is unavailable.\n */\nexport class IdentityPrinter extends Printer {\n  static printERBNode(node: Nodes.ERBNode) {\n    const printer = new IdentityPrinter()\n\n    printer.printERBNode(node)\n\n    return printer.context.getOutput()\n  }\n\n  visitLiteralNode(node: Nodes.LiteralNode): void {\n    this.write(node.content)\n  }\n\n  visitHTMLTextNode(node: Nodes.HTMLTextNode): void {\n    this.write(node.content)\n  }\n\n  visitWhitespaceNode(node: Nodes.WhitespaceNode): void {\n    if (node.value) {\n      this.write(node.value.value)\n    }\n  }\n\n  visitHTMLOpenTagNode(node: Nodes.HTMLOpenTagNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    if (node.tag_name) {\n      this.write(node.tag_name.value)\n    }\n\n    let previousEnd = node.tag_name?.location.end ?? node.tag_opening?.location.end\n\n    node.children.forEach(child => {\n      if (previousEnd && !isWhitespaceNode(child) && !this.context.endsWithWhitespace()) {\n        this.write(this.separatorBetween(node.source, previousEnd, child.location.start))\n      }\n\n      this.visit(child)\n\n      previousEnd = child.location.end\n    })\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitHTMLCloseTagNode(node: Nodes.HTMLCloseTagNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    if (node.tag_name) {\n      const before = getNodesBeforePosition(node.children, node.tag_name.location.start, true)\n      const after = getNodesAfterPosition(node.children, node.tag_name.location.end)\n\n      this.visitAll(before)\n      this.write(node.tag_name.value)\n      this.visitAll(after)\n    } else {\n      this.visitAll(node.children)\n    }\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitHTMLVirtualCloseTagNode(_node: Nodes.HTMLVirtualCloseTagNode): void {\n    // Virtual closing tags don't print anything (they are synthetic)\n  }\n\n  visitHTMLOmittedCloseTagNode(_node: Nodes.HTMLOmittedCloseTagNode): void {\n    // Omitted closing tags don't print anything\n  }\n\n  visitHTMLElementNode(node: Nodes.HTMLElementNode): void {\n    const tagName = node.tag_name?.value\n\n    if (tagName) {\n      this.context.enterTag(tagName)\n    }\n\n    if (node.open_tag) {\n      this.visit(node.open_tag)\n    }\n\n    if (node.body) {\n      node.body.forEach(child => this.visit(child))\n    }\n\n    if (node.close_tag) {\n      this.visit(node.close_tag)\n    }\n\n    if (tagName) {\n      this.context.exitTag()\n    }\n  }\n\n  visitHTMLConditionalElementNode(node: Nodes.HTMLConditionalElementNode): void {\n    const tagName = node.tag_name?.value\n\n    if (tagName) {\n      this.context.enterTag(tagName)\n    }\n\n    if (node.open_conditional) {\n      this.visit(node.open_conditional)\n    }\n\n    if (node.body) {\n      node.body.forEach(child => this.visit(child))\n    }\n\n    if (node.close_conditional) {\n      this.visit(node.close_conditional)\n    }\n\n    if (tagName) {\n      this.context.exitTag()\n    }\n  }\n\n  visitHTMLAttributeNode(node: Nodes.HTMLAttributeNode): void {\n    if (node.name) {\n      this.visit(node.name)\n    }\n\n    if (node.equals) {\n      this.write(node.equals.value)\n    }\n\n    if (node.equals && node.value) {\n      this.visit(node.value)\n    }\n  }\n\n  visitHTMLAttributeNameNode(node: Nodes.HTMLAttributeNameNode): void {\n    this.visitChildNodes(node)\n  }\n\n  visitHTMLAttributeValueNode(node: Nodes.HTMLAttributeValueNode): void {\n    if (node.quoted) {\n      this.write(node.open_quote?.value ?? '\"')\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.quoted) {\n      this.write(node.close_quote?.value ?? '\"')\n    }\n  }\n\n  visitRubyLiteralNode(node: Nodes.RubyLiteralNode): void {\n    this.write(node.content)\n  }\n\n  visitRubyHTMLAttributesSplatNode(node: Nodes.RubyHTMLAttributesSplatNode): void {\n    this.write(node.content)\n  }\n\n  visitHTMLCommentNode(node: Nodes.HTMLCommentNode): void {\n    if (node.comment_start) {\n      this.write(node.comment_start.value)\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.comment_end) {\n      this.write(node.comment_end.value)\n    }\n  }\n\n  visitHTMLDoctypeNode(node: Nodes.HTMLDoctypeNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitXMLDeclarationNode(node: Nodes.XMLDeclarationNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitXMLProcessingInstructionNode(node: Nodes.XMLProcessingInstructionNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    if (node.target) {\n      this.write(node.target.value)\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitCDATANode(node: Nodes.CDATANode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    this.visitChildNodes(node)\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n  }\n\n  visitERBOpenTagNode(node: Nodes.ERBOpenTagNode): void {\n    this.printERBNode(node)\n  }\n\n  visitERBContentNode(node: Nodes.ERBContentNode): void {\n    this.printERBNode(node)\n  }\n\n  visitERBCommentNode(node: Nodes.ERBCommentNode): void {\n    this.printERBNode(node)\n  }\n\n  visitERBIfNode(node: Nodes.ERBIfNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.subsequent) {\n      this.visit(node.subsequent)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBElseNode(node: Nodes.ERBElseNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n  }\n\n  visitERBEndNode(node: Nodes.ERBEndNode): void {\n    this.printERBNode(node)\n  }\n\n  visitERBBlockNode(node: Nodes.ERBBlockNode): void {\n    this.printERBNode(node)\n\n    if (node.body) {\n      node.body.forEach(child => this.visit(child))\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBIterationBlockNode(node: Nodes.ERBIterationBlockNode): void {\n    this.printERBNode(node)\n\n    if (node.body) {\n      node.body.forEach(child => this.visit(child))\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBCaseNode(node: Nodes.ERBCaseNode): void {\n    this.printERBNode(node)\n\n    if (node.children) {\n      node.children.forEach(child => this.visit(child))\n    }\n\n    if (node.conditions) {\n      node.conditions.forEach(condition => this.visit(condition))\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBWhenNode(node: Nodes.ERBWhenNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n  }\n\n  visitERBWhileNode(node: Nodes.ERBWhileNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBUntilNode(node: Nodes.ERBUntilNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBForNode(node: Nodes.ERBForNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBBeginNode(node: Nodes.ERBBeginNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBRescueNode(node: Nodes.ERBRescueNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.subsequent) {\n      this.visit(node.subsequent)\n    }\n  }\n\n  visitERBEnsureNode(node: Nodes.ERBEnsureNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n  }\n\n  visitERBUnlessNode(node: Nodes.ERBUnlessNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBRenderNode(node: Nodes.ERBRenderNode): void {\n    this.printERBNode(node)\n\n    if (node.end_node) {\n      if (node.body) {\n        node.body.forEach(child => this.visit(child))\n      }\n\n      if (node.rescue_clause) {\n        this.visit(node.rescue_clause)\n      }\n\n      if (node.else_clause) {\n        this.visit(node.else_clause)\n      }\n\n      if (node.ensure_clause) {\n        this.visit(node.ensure_clause)\n      }\n\n      this.visit(node.end_node)\n    }\n  }\n\n  visitRubyRenderKeywordsNode(_node: Nodes.RubyRenderKeywordsNode): void {\n    // no-op: extracted metadata, nothing to print\n  }\n\n  visitRubyRenderLocalNode(_node: Nodes.RubyRenderLocalNode): void {\n    // extracted metadata, nothing to print\n  }\n\n  visitERBStrictLocalsNode(node: Nodes.ERBStrictLocalsNode): void {\n    this.printERBNode(node)\n  }\n\n  visitHerbDirectiveNode(node: Nodes.HerbDirectiveNode): void {\n    this.printERBNode(node)\n  }\n\n  visitHerbStateDirectiveNode(node: Nodes.HerbStateDirectiveNode): void {\n    this.printERBNode(node)\n  }\n\n  visitHerbStateDeclarationNode(_node: Nodes.HerbStateDeclarationNode): void {\n    // extracted metadata, nothing to print\n  }\n\n  visitRubyParameterNode(_node: Nodes.RubyParameterNode): void {\n    // extracted metadata, nothing to print\n  }\n\n  visitERBYieldNode(node: Nodes.ERBYieldNode): void {\n    this.printERBNode(node)\n  }\n\n  visitERBInNode(node: Nodes.ERBInNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n  }\n\n  visitERBCaseMatchNode(node: Nodes.ERBCaseMatchNode): void {\n    this.printERBNode(node)\n\n    if (node.children) {\n      node.children.forEach(child => this.visit(child))\n    }\n\n    if (node.conditions) {\n      node.conditions.forEach(condition => this.visit(condition))\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  /**\n   * Recover the whitespace separating two adjacent parts of an open tag\n   *\n   * A WhitespaceNode is its own separator, so nothing is written on either side of one.\n   */\n  protected separatorBetween(source: string | null, from: Nodes.Position, to: Nodes.Position): string {\n    if (!from.isBefore(to)) return \"\"\n    if (!source) return \" \"\n\n    const separator = sliceBetweenPositions(source, from, to)\n\n    if (separator === null || separator === \"\" || separator.trim() !== \"\") return \" \"\n\n    return separator\n  }\n\n  /**\n   * Print ERB node tags and content\n   */\n  protected printERBNode(node: Nodes.ERBNode): void {\n    if (node.tag_opening) {\n      this.write(node.tag_opening.value)\n    }\n\n    if (node.content) {\n      this.write(node.content.value)\n    }\n\n    if (node.tag_closing) {\n      this.write(node.tag_closing.value)\n    }\n   }\n}\n","export type IndentStyle = \"space\" | \"tab\"\n\nexport const LEADING_BLANKS = /^[^\\S\\n]*/\n\n/**\n * Convert the leading indentation of every line in `source` between spaces and tabs.\n *\n * Only whole `indentWidth`-space groups are converted to tabs; any remainder\n * (e.g. alignment padding that isn't a full indent level) is left as spaces.\n * Existing tabs are expanded to `indentWidth` spaces before conversion, so\n * mixed indentation is normalized regardless of the target `indentStyle`.\n */\nexport function convertIndentation(source: string, indentWidth: number, indentStyle: IndentStyle): string {\n  const lines = source.split(\"\\n\")\n\n  const result = lines.map((line) => {\n    const match = line.match(LEADING_BLANKS)\n\n    if (!match || match[0].length === 0) return line\n\n    const leading = match[0]\n    const normalized = leading.replace(/\\t/g, \" \".repeat(indentWidth))\n\n    const replaced = indentStyle === \"tab\"\n      ? \"\\t\".repeat(Math.floor(normalized.length / indentWidth)) + \" \".repeat(normalized.length % indentWidth)\n      : normalized\n\n    return replaced + line.substring(leading.length)\n  })\n\n  return result.join(\"\\n\")\n}\n","import { IdentityPrinter } from \"./identity-printer.js\"\n\nimport type * as Nodes from \"@herb-tools/core\"\n\n/**\n * IndentPrinter - Re-indentation printer that preserves content but adjusts indentation\n *\n * Extends IdentityPrinter to preserve all content as-is while replacing\n * leading whitespace on each line with the correct indentation based on\n * the AST nesting depth.\n */\nexport class IndentPrinter extends IdentityPrinter {\n  protected indentLevel: number = 0\n  protected indentWidth: number\n  private pendingIndent: boolean = false\n\n  constructor(indentWidth: number = 2) {\n    super()\n\n    this.indentWidth = indentWidth\n  }\n\n  protected get indent(): string {\n    return \" \".repeat(this.indentLevel * this.indentWidth)\n  }\n\n  protected write(content: string): void {\n    if (this.pendingIndent && content.length > 0) {\n      this.pendingIndent = false\n      this.context.write(this.indent + content)\n    } else {\n      this.context.write(content)\n    }\n  }\n\n  visitLiteralNode(node: Nodes.LiteralNode): void {\n    this.writeWithIndent(node.content)\n  }\n\n  visitHTMLTextNode(node: Nodes.HTMLTextNode): void {\n    this.writeWithIndent(node.content)\n  }\n\n  visitHTMLElementNode(node: Nodes.HTMLElementNode): void {\n    const tagName = node.tag_name?.value\n\n    if (tagName) {\n      this.context.enterTag(tagName)\n    }\n\n    if (node.open_tag) {\n      this.visit(node.open_tag)\n    }\n\n    if (node.body) {\n      this.indentLevel++\n      node.body.forEach(child => this.visit(child))\n      this.indentLevel--\n    }\n\n    if (node.close_tag) {\n      this.visit(node.close_tag)\n    }\n\n    if (tagName) {\n      this.context.exitTag()\n    }\n  }\n\n  visitERBIfNode(node: Nodes.ERBIfNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.subsequent) {\n      this.visit(node.subsequent)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBElseNode(node: Nodes.ERBElseNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n  }\n\n  visitERBBlockNode(node: Nodes.ERBBlockNode): void {\n    this.printERBNode(node)\n\n    if (node.body) {\n      this.indentLevel++\n      node.body.forEach(child => this.visit(child))\n      this.indentLevel--\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBIterationBlockNode(node: Nodes.ERBIterationBlockNode): void {\n    this.printERBNode(node)\n\n    if (node.body) {\n      this.indentLevel++\n      node.body.forEach(child => this.visit(child))\n      this.indentLevel--\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBCaseNode(node: Nodes.ERBCaseNode): void {\n    this.printERBNode(node)\n\n    if (node.children) {\n      this.indentLevel++\n      node.children.forEach(child => this.visit(child))\n      this.indentLevel--\n    }\n\n    if (node.conditions) {\n      this.indentLevel++\n      node.conditions.forEach(condition => this.visit(condition))\n      this.indentLevel--\n    }\n\n    if (node.else_clause) {\n      this.indentLevel++\n      this.visit(node.else_clause)\n      this.indentLevel--\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBWhenNode(node: Nodes.ERBWhenNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n  }\n\n  visitERBWhileNode(node: Nodes.ERBWhileNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBUntilNode(node: Nodes.ERBUntilNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBForNode(node: Nodes.ERBForNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBBeginNode(node: Nodes.ERBBeginNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.rescue_clause) {\n      this.visit(node.rescue_clause)\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.ensure_clause) {\n      this.visit(node.ensure_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  visitERBRescueNode(node: Nodes.ERBRescueNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.subsequent) {\n      this.visit(node.subsequent)\n    }\n  }\n\n  visitERBEnsureNode(node: Nodes.ERBEnsureNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n  }\n\n  visitERBUnlessNode(node: Nodes.ERBUnlessNode): void {\n    this.printERBNode(node)\n\n    if (node.statements) {\n      this.indentLevel++\n      node.statements.forEach(statement => this.visit(statement))\n      this.indentLevel--\n    }\n\n    if (node.else_clause) {\n      this.visit(node.else_clause)\n    }\n\n    if (node.end_node) {\n      this.visit(node.end_node)\n    }\n  }\n\n  /**\n   * Write content, replacing leading whitespace on each line with the current indent.\n   *\n   * Uses a pendingIndent mechanism: when content ends with a newline followed by\n   * whitespace-only, sets pendingIndent=true instead of writing the indent immediately.\n   * The indent is then applied at the correct level when the next node writes content\n   * (via the overridden write() method).\n   */\n  protected writeWithIndent(content: string): void {\n    if (!content.includes(\"\\n\")) {\n      if (this.pendingIndent) {\n        this.pendingIndent = false\n\n        const trimmed = content.replace(/^[ \\t]+/, \"\")\n\n        if (trimmed.length > 0) {\n          this.context.write(this.indent + trimmed)\n        }\n      } else {\n        this.context.write(content)\n      }\n\n      return\n    }\n\n    const lines = content.split(\"\\n\")\n    const lastIndex = lines.length - 1\n\n    for (let i = 0; i < lines.length; i++) {\n      if (i > 0) {\n        this.context.write(\"\\n\")\n      }\n\n      const line = lines[i]\n      const trimmed = line.replace(/^[ \\t]+/, \"\")\n\n      if (i === 0) {\n        if (this.pendingIndent) {\n          this.pendingIndent = false\n\n          if (trimmed.length > 0) {\n            this.context.write(this.indent + trimmed)\n          }\n        } else {\n          this.context.write(line)\n        }\n      } else if (i === lastIndex && trimmed.length === 0) {\n        this.pendingIndent = true\n      } else if (trimmed.length === 0) {\n        // Middle whitespace-only line: write nothing (newline already written above)\n      } else {\n        this.context.write(this.indent + trimmed)\n      }\n    }\n  }\n}\n","import { IdentityPrinter } from \"./identity-printer.js\"\nimport { PrintOptions, DEFAULT_PRINT_OPTIONS } from \"./printer.js\"\nimport { isERBOutputNode, filterNodes, ERBContentNode, isERBIfNode, isERBUnlessNode, isERBElseNode, isHTMLTextNode } from \"@herb-tools/core\"\n\nimport { HTMLTextNode, ERBIfNode, ERBUnlessNode, ERBCommentNode, Node, HTMLAttributeValueNode } from \"@herb-tools/core\"\n\nexport interface ERBToRubyStringOptions extends PrintOptions {\n  /**\n   * Whether to force wrapping the output in double quotes even for single ERB nodes\n   * @default false\n   */\n  forceQuotes?: boolean\n}\n\nexport const DEFAULT_ERB_TO_RUBY_STRING_OPTIONS: ERBToRubyStringOptions = {\n  ...DEFAULT_PRINT_OPTIONS,\n  forceQuotes: false\n}\n\n/**\n * ERBToRubyStringPrinter - Converts ERB snippets to Ruby strings with interpolation\n *\n * This printer transforms ERB templates into Ruby strings by:\n * - Converting literal text to string content\n * - Converting <%= %> tags to #{} interpolation\n * - Converting simple if/else blocks to ternary operators\n * - Ignoring <% %> tags (they don't produce output)\n *\n * Examples:\n * - `hello world <%= hello %>` => `\"hello world #{hello}\"`\n * - `hello world <% hello %>` => `\"hello world \"`\n * - `Welcome <%= user.name %>!` => `\"Welcome #{user.name}!\"`\n * - `<% if logged_in? %>Welcome<% else %>Login<% end %>` => `\"logged_in? ? \"Welcome\" : \"Login\"`\n * - `<% if logged_in? %>Welcome<% else %>Login<% end %>!` => `\"#{logged_in? ? \"Welcome\" : \"Login\"}!\"`\n */\nexport class ERBToRubyStringPrinter extends IdentityPrinter {\n  static print(node: Node, options: Partial<ERBToRubyStringOptions> = DEFAULT_ERB_TO_RUBY_STRING_OPTIONS): string {\n    const erbNodes = filterNodes([node], ERBContentNode)\n\n    if (erbNodes.length === 1 && isERBOutputNode(erbNodes[0]) && !options.forceQuotes) {\n      return (erbNodes[0].content?.value || \"\").trim()\n    }\n\n    if ('children' in node && Array.isArray(node.children)) {\n      const childErbNodes = filterNodes(node.children, ERBContentNode)\n      const hasOnlyERBContent = node.children.length > 0 && node.children.length === childErbNodes.length\n\n      if (hasOnlyERBContent && childErbNodes.length === 1 && isERBOutputNode(childErbNodes[0]) && !options.forceQuotes) {\n        return (childErbNodes[0].content?.value || \"\").trim()\n      }\n\n      const firstChild = node.children[0]\n\n      if (node.children.length === 1 && isERBIfNode(firstChild) && !options.forceQuotes) {\n        const printer = new ERBToRubyStringPrinter()\n\n        if (printer.canConvertToTernary(firstChild)) {\n          printer.convertToTernaryWithoutWrapper(firstChild)\n          return printer.context.getOutput()\n        }\n      }\n\n      if (node.children.length === 1 && isERBUnlessNode(firstChild) && !options.forceQuotes) {\n        const printer = new ERBToRubyStringPrinter()\n\n        if (printer.canConvertUnlessToTernary(firstChild)) {\n          printer.convertUnlessToTernaryWithoutWrapper(firstChild)\n          return printer.context.getOutput()\n        }\n      }\n    }\n\n    const printer = new ERBToRubyStringPrinter()\n\n    printer.context.write('\"')\n\n    printer.visit(node)\n\n    printer.context.write('\"')\n\n    return printer.context.getOutput()\n  }\n\n  visitHTMLTextNode(node: HTMLTextNode) {\n    if (node.content) {\n      const escapedContent = node.content.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n      this.context.write(escapedContent)\n    }\n  }\n\n  visitERBCommentNode(_node: ERBCommentNode) {\n    // a comment contributes nothing to the Ruby string\n  }\n\n  visitERBContentNode(node: ERBContentNode) {\n    if (isERBOutputNode(node)) {\n      this.context.write(\"#{\")\n\n      if (node.content?.value) {\n        this.context.write(node.content.value.trim())\n      }\n\n      this.context.write(\"}\")\n    }\n  }\n\n  visitERBIfNode(node: ERBIfNode) {\n    if (this.canConvertToTernary(node)) {\n      this.convertToTernary(node)\n    }\n  }\n\n  visitERBUnlessNode(node: ERBUnlessNode) {\n    if (this.canConvertUnlessToTernary(node)) {\n      this.convertUnlessToTernary(node)\n    }\n  }\n\n  visitHTMLAttributeValueNode(node: HTMLAttributeValueNode) {\n    this.visitChildNodes(node)\n  }\n\n  private canConvertToTernary(node: ERBIfNode): boolean {\n    if (node.subsequent && !isERBElseNode(node.subsequent)) {\n      return false\n    }\n\n    const ifOnlyText = node.statements ? node.statements.every(isHTMLTextNode) : true\n    if (!ifOnlyText) return false\n\n    if (isERBElseNode(node.subsequent)) {\n      return node.subsequent.statements\n        ? node.subsequent.statements.every(isHTMLTextNode)\n        : true\n    }\n\n    return true\n  }\n\n  private convertToTernary(node: ERBIfNode) {\n    this.context.write(\"#{\")\n\n    if (node.content?.value) {\n      const condition = node.content.value.trim()\n      const cleanCondition = condition.replace(/^if\\s+/, '')\n      const needsParentheses = cleanCondition.includes(' ')\n\n      if (needsParentheses) {\n        this.context.write(\"(\")\n      }\n\n      this.context.write(cleanCondition)\n\n      if (needsParentheses) {\n        this.context.write(\")\")\n      }\n    }\n\n    this.context.write(\" ? \")\n    this.context.write('\"')\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\" : \")\n    this.context.write('\"')\n\n    if (isERBElseNode(node.subsequent) && node.subsequent.statements) {\n      node.subsequent.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\"}\")\n  }\n\n  private convertToTernaryWithoutWrapper(node: ERBIfNode) {\n    if (node.subsequent && !isERBElseNode(node.subsequent)) {\n      return false\n    }\n\n    if (node.content?.value) {\n      const condition = node.content.value.trim()\n      const cleanCondition = condition.replace(/^if\\s+/, '')\n      const needsParentheses = cleanCondition.includes(' ')\n\n      if (needsParentheses) {\n        this.context.write(\"(\")\n      }\n\n      this.context.write(cleanCondition)\n\n      if (needsParentheses) {\n        this.context.write(\")\")\n      }\n    }\n\n    this.context.write(\" ? \")\n    this.context.write('\"')\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\" : \")\n    this.context.write('\"')\n\n    if (isERBElseNode(node.subsequent) && node.subsequent.statements) {\n      node.subsequent.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n  }\n\n  private canConvertUnlessToTernary(node: ERBUnlessNode): boolean {\n    const unlessOnlyText = node.statements ? node.statements.every(isHTMLTextNode) : true\n\n    if (!unlessOnlyText) return false\n\n    if (isERBElseNode(node.else_clause)) {\n      return node.else_clause.statements\n        ? node.else_clause.statements.every(isHTMLTextNode)\n        : true\n    }\n\n    return true\n  }\n\n  private convertUnlessToTernary(node: ERBUnlessNode) {\n    this.context.write(\"#{\")\n\n    if (node.content?.value) {\n      const condition = node.content.value.trim()\n      const cleanCondition = condition.replace(/^unless\\s+/, '')\n      const needsParentheses = cleanCondition.includes(' ')\n\n      this.context.write(\"!(\")\n\n      if (needsParentheses) {\n        this.context.write(\"(\")\n      }\n\n      this.context.write(cleanCondition)\n\n      if (needsParentheses) {\n        this.context.write(\")\")\n      }\n\n      this.context.write(\")\")\n    }\n\n    this.context.write(\" ? \")\n    this.context.write('\"')\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\" : \")\n    this.context.write('\"')\n\n    if (isERBElseNode(node.else_clause)) {\n      node.else_clause.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\"}\")\n  }\n\n  private convertUnlessToTernaryWithoutWrapper(node: ERBUnlessNode) {\n    if (node.content?.value) {\n      const condition = node.content.value.trim()\n      const cleanCondition = condition.replace(/^unless\\s+/, '')\n      const needsParentheses = cleanCondition.includes(' ')\n\n      this.context.write(\"!(\")\n\n      if (needsParentheses) {\n        this.context.write(\"(\")\n      }\n\n      this.context.write(cleanCondition)\n\n      if (needsParentheses) {\n        this.context.write(\")\")\n      }\n\n      this.context.write(\")\")\n    }\n\n    this.context.write(\" ? \")\n    this.context.write('\"')\n\n    if (node.statements) {\n      node.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n    this.context.write(\" : \")\n    this.context.write('\"')\n\n    if (isERBElseNode(node.else_clause)) {\n      node.else_clause.statements.forEach(statement => this.visit(statement))\n    }\n\n    this.context.write('\"')\n  }\n}\n"],"mappings":"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"}