Sha256: 21b02f84c9ad75da1b76d358295ef7d0423d9ef7c1a8d2b44352a28ef4f3641f
Contents?: true
Size: 1.77 KB
Versions: 2
Compression:
Stored size: 1.77 KB
Contents
# frozen_string_literal: true require "forwardable" module Tocer # Builds table of contents for a Markdown document. class Builder extend Forwardable include Dependencies[:settings] CODE_BLOCK_PUNCTUATION = "```" def_delegators :comment_block, :start_index, :finish_index, :comments, :prependable? 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 super(**) end def unbuildable?(lines) = comment_block.empty?(lines) && headers(lines).empty? def call lines return "" if headers(lines).empty? url_count.clear assemble(lines).join end private attr_reader :comment_block, :transformer, :url_count attr_accessor :code_block def assemble lines [ "#{comment_block.start_tag}\n\n", "#{settings.label}\n\n", links(lines).join("\n"), "\n\n#{comment_block.finish_tag}\n" ] end def links(lines) = headers(lines).map { |markdown| transform markdown } def headers lines lines.select do |line| toggle_code_block line line.start_with?(Parsers::Header::PUNCTUATION) && !code_block end end def toggle_code_block line return unless line.start_with? CODE_BLOCK_PUNCTUATION self.code_block = !code_block end 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 url_suffix(url) = url_count[url].then { |count| count.zero? ? "" : count } end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
tocer-19.1.0 | lib/tocer/builder.rb |
tocer-19.0.0 | lib/tocer/builder.rb |