Sha256: 88974f704163e27def4cac189cf54e3dcffcbce7fd6c6ff0f02bfd464cffae35

Contents?: true

Size: 1.73 KB

Versions: 8

Compression:

Stored size: 1.73 KB

Contents

module Ruco
  class StyleMap
    attr_accessor :lines

    def initialize(lines)
      @lines = Array.new(lines)
    end

    def add(style, line, columns)
      @lines[line] ||= []
      @lines[line] << [style, columns]
    end

    def flatten
      @lines.map do |styles|
        next unless styles

        # start and one after end of every column-range changes styles
        points_of_change = styles.map{|s,c| [c.first, c.last+1] }.flatten

        flat = []

        styles.each do |style, columns|
          points_of_change.each do |point|
            next unless columns.include?(point)
            flat[point] ||= []
            flat[point].unshift style
          end
        end

        max = styles.map{|s,c|c.last}.max
        flat[max+1] = []
        flat
      end
    end

    def +(other)
      lines = self.lines + other.lines
      new = StyleMap.new(0)
      new.lines = lines
      new
    end

    def slice!(*args)
      sliced = lines.slice!(*args)
      new = StyleMap.new(0)
      new.lines = sliced
      new
    end

    def shift
      slice!(0, 1)
    end

    def pop
      slice!(-1, 1)
    end
    
    STYLES = {
      :normal => 0,
      :reverse => Curses::A_REVERSE
    }

    def self.styled(content, styles)
      styles ||= []
      content = content.dup

      build = []
      build << [[]]

      buffered = ''
      styles.each do |style|
        if style
          build[-1] << buffered
          buffered = ''

          # set new style
          build << [style]
        end
        buffered << (content.slice!(0,1) || '')
      end
      build[-1] << buffered + content
      build
    end

    def self.curses_style(styles)
      styles.sum{|style| STYLES[style] or raise("Unknown style #{style}") }
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
ruco-0.0.50 lib/ruco/style_map.rb
ruco-0.0.49 lib/ruco/style_map.rb
ruco-0.0.48 lib/ruco/style_map.rb
ruco-0.0.47 lib/ruco/style_map.rb
ruco-0.0.46 lib/ruco/style_map.rb
ruco-0.0.45 lib/ruco/style_map.rb
ruco-0.0.44 lib/ruco/style_map.rb
ruco-0.0.43 lib/ruco/style_map.rb