Sha256: 90c678728f3be3daa400ff92b57498d430844a7a21afdbd0df55860721624ef5

Contents?: true

Size: 1.46 KB

Versions: 5

Compression:

Stored size: 1.46 KB

Contents

# frozen_string_literal: true

require "refinements/arrays"
require "refinements/pathnames"

module Tocer
  # Writes table of contents to a Markdown document.
  # :reek:DataClump
  class Writer
    using Refinements::Arrays
    using Refinements::Pathnames

    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

    def self.remove start_index, finish_index, lines
      range = (start_index - 1)..finish_index
      lines.reject.with_index { |_, index| range.include? index }
    end

    def initialize builder: Builder.new
      @builder = builder
    end

    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

    attr_reader :builder

    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

    def prepend(lines, label) = [content(lines, label), lines.join].compress.join("\n")

    def content(lines, label) = builder.call(lines, label: label)
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
tocer-12.2.0 lib/tocer/writer.rb
tocer-12.1.0 lib/tocer/writer.rb
tocer-12.0.4 lib/tocer/writer.rb
tocer-12.0.3 lib/tocer/writer.rb
tocer-12.0.2 lib/tocer/writer.rb