class Ariadne::Forms::BufferRewriter
:nodoc:
def calc_line_offsets(code)
def calc_line_offsets(code) idx = -1 [0].tap do |offsets| while (idx = code.index(/\r?\n/, idx + 1)) offsets << Regexp.last_match.end(0) end end end
def on_var_ref(var)
def on_var_ref(var) return unless var == "@output_buffer" var_refs << [lineno, column] end
def rewrite(code)
def rewrite(code) parser = new(code, "(code)", 0) parser.parse line_offsets = calc_line_offsets(code) code.dup.tap do |result| parser.var_refs.reverse_each do |lineno, stop| line_offset = line_offsets[lineno] stop += line_offset stop -= 1 if stop < code.length start = stop - "@output_buffer".length result[start...stop] = "output_buffer" end end end
def var_refs
def var_refs @var_refs ||= [] end