class Tocer::Writer

Writes table of contents to a Markdown document. :reek: DataClump

Attributes

builder[R]

Public Class Methods

add(start_index:, old_lines:, new_lines: computed_new_lines = start_index.zero? ? new_lines : new_lines + "\n") click to toggle source
# File lib/tocer/writer.rb, line 13
def self.add start_index:, old_lines:, new_lines:
  computed_new_lines = start_index.zero? ? new_lines : new_lines + "\n"
  old_lines.insert start_index, *computed_new_lines
end
new(builder: Builder.new) click to toggle source
# File lib/tocer/writer.rb, line 23
def initialize builder: Builder.new
  @builder = builder
end
remove(start_index, finish_index, lines) click to toggle source
# File lib/tocer/writer.rb, line 18
def self.remove start_index, finish_index, lines
  range = (start_index - 1)..finish_index
  lines.reject.with_index { |_, index| range.include? index }
end

Public Instance Methods

call(path, label: CLI::Configuration::Loader.call.label) click to toggle source
# File lib/tocer/writer.rb, line 27
def call path, label: CLI::Configuration::Loader.call.label
  path.rewrite do |body|
    lines = body.each_line.to_a
    builder.prependable?(lines) ? prepend(lines, label) : replace(lines, label)
  end
end

Private Instance Methods

content(lines, label) click to toggle source
# File lib/tocer/writer.rb, line 52
  def content(lines, label) = builder.call(lines, label: label)
end
prepend(lines, label) click to toggle source
# File lib/tocer/writer.rb, line 50
    def prepend(lines, label) = [content(lines, label), lines.join].compress.join("\n")

    def content(lines, label) = builder.call(lines, label: label)
  end
end
replace(lines, label) click to toggle source
# File lib/tocer/writer.rb, line 38
def replace lines, label
  start_index = builder.start_index lines
  finish_index = builder.finish_index lines
  klass = self.class

  klass.add(
    start_index: start_index,
    old_lines: klass.remove(start_index, finish_index, lines),
    new_lines: content(lines[finish_index, lines.length], label)
  ).join
end