DannyBen/madman

View on GitHub
lib/madman/yamldoc.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'madman/refinements/string'
require 'madman/refinements/array'

module Madman
  class YAMLDoc
    using StringRefinements
    using ArrayRefinements

    attr_reader :yaml, :title

    def initialize(yaml, title: nil)
      @yaml = yaml
      @title = title
    end

    def render
      slim.render self
    end

    def template
      File.expand_path '../views/yamldoc.slim', __dir__
    end

    def slim
      @slim ||= Slim::Template.new template, slim_options
    end

    def slim_options
      { pretty: true, disable_escape: true }
    end

    def tree
      @tree ||= tree!
    end

  private

    def counter
      @counter ||= 0
      @counter += 1
    end

    def tree!(data = nil, indent = 0, caption = 2)
      data ||= yaml
      result = []
      caption = 6 if caption > 6

      data.each do |key, value|
        result.push render_pair key, value, indent, caption
      end

      result.join "\n"
    end

    def render_pair(key, value, indent, caption)
      slug = "#{key.slug}-#{counter}"
      space = '  '
      result = []

      if key[0] == '_'
        result.push "#{space * indent}<div>"
      else
        result.push "#{space * indent}<h#{caption}><a href='##{slug}' class='clickable'>#{key}</a></h#{caption}>"
        result.push "#{space * indent}<div class='hidden' id='#{slug}'>"
      end

      if value.is_a? Hash
        result.push tree!(value, indent + 1, caption + 1)
      elsif value
        result.push "#{space * (indent + 1)}#{value.to_html}"
      end

      result.push "#{space * indent}</div>"
      result
    end
  end
end