class Tocer::Builder

Builds table of contents for a Markdown document.

def assemble lines, label

def assemble lines, label
  [
    "#{comment_block.start_tag}\n\n",
    "#{label}\n\n",
    links(lines).join("\n"),
    "\n\n#{comment_block.finish_tag}\n"
  ]
end

def call lines, label: Container[:configuration].label

def call lines, label: Container[:configuration].label
  return "" if headers(lines).empty?
  url_count.clear
  assemble(lines, label).join
end

def headers lines

def headers lines
  lines.select do |line|
    toggle_code_block line
    line.start_with?(Parsers::Header::PUNCTUATION) && !code_block
  end
end

def initialize comment_block: Elements::CommentBlock.new, transformer: Transformers::Finder.new

def initialize comment_block: Elements::CommentBlock.new, transformer: Transformers::Finder.new
  @comment_block = comment_block
  @transformer = transformer
  @url_count = Hash.new 0
  @code_block = false
end

def links(lines) = headers(lines).map { |markdown| transform markdown }

def links(lines) = headers(lines).map { |markdown| transform markdown }

def toggle_code_block line

def toggle_code_block line
  return unless line.start_with? CODE_BLOCK_PUNCTUATION
  self.code_block = !code_block
end

def transform markdown

def transform markdown
  transformer.call(markdown).then do |instance|
    url = instance.url
    link = instance.call url_suffix: url_suffix(url)
    url_count[url] += 1
    link
  end
end

def unbuildable?(lines) = comment_block.empty?(lines) && headers(lines).empty?

def unbuildable?(lines) = comment_block.empty?(lines) && headers(lines).empty?

def url_suffix(url) = url_count[url].then { |count| count.zero? ? "" : count }

def url_suffix(url) = url_count[url].then { |count| count.zero? ? "" : count }