Sha256: 4111bd712a5d0937e7cd1d6493709474c0b7010653d1cee552c3bd2e690cfc26

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

require 'vedeu/models/line'
require 'vedeu/models/stream'

module Vedeu
  class RenderInterface
    def self.call(interface)
      new(interface).render
    end

    def initialize(interface)
      @interface = interface
    end

    def render
      out = [interface.clear]
      processed_lines.each_with_index do |line, index|
        if index + 1 <= height
          out << interface.geometry.origin(index)
          out << line.to_s
        end
      end
      out.join
    end

    private

    attr_reader :interface

    def processed_lines
      return [] unless lines.any? { |line| line.streams.any? }

      lines.map do |line|
        line_length = 0
        streams     = line.streams.inject([]) do |processed, stream|
          next if stream.text.empty?

          if (line_length += stream.text.size) >= width
            remainder = width - line_length

            processed << Stream.new(text:   truncate(stream.text, remainder),
                                    style:  stream.style,
                                    colour: stream.colour)

          else
            processed << stream

          end
        end

        Line.new(streams: streams,
                 style:   line.style,
                 colour:  line.colour)
      end
    end

    def truncate(text, value)
      text.chomp.slice(0...value)
    end

    def lines
      interface.lines
    end

    def height
      interface.geometry.height
    end

    def width
      interface.geometry.width
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vedeu-0.1.7 lib/vedeu/output/render_interface.rb