class Coopy::TerminalDiffRender

Attributes

align_columns[RW]
codes[RW]
csv[RW]
delim[RW]
diff[RW]
flags[RW]
t[RW]
use_glyphs[RW]
v[RW]
wide_columns[RW]

Public Class Methods

new(flags = nil,delim = nil,diff = true) click to toggle source
# File lib/lib/coopy/terminal_diff_render.rb, line 7
def initialize(flags = nil,delim = nil,diff = true)
  @align_columns = true
  @wide_columns = false
  @use_glyphs = true
  @flags = flags
  if flags != nil 
    @align_columns = false if flags.padding_strategy == "dense"
    @wide_columns = true if flags.padding_strategy == "sparse"
    @use_glyphs = flags.use_glyphs
  end
  if delim != nil 
    @delim = delim
  else 
    @delim = ","
  end
  @diff = diff
end

Public Instance Methods

render(t) click to toggle source
# File lib/lib/coopy/terminal_diff_render.rb, line 44
def render(t)
  @csv = ::Coopy::Csv.new
  result = ""
  w = t.get_width
  h = t.get_height
  @t = t
  @v = t.get_cell_view
  @codes = {}
  @codes["header"] = "\x1B[0;1m"
  @codes["minor"] = "\x1B[33m"
  @codes["done"] = "\x1B[0m"
  @codes["meta"] = "\x1B[0;1m"
  @codes["spec"] = "\x1B[35;1m"
  @codes["add"] = "\x1B[32;1m"
  @codes["conflict"] = "\x1B[33;1m"
  @codes["modify"] = "\x1B[34;1m"
  @codes["remove"] = "\x1B[31;1m"
  sizes = nil
  sizes = self.pick_sizes(t) if @align_columns
  txts = Array.new
  begin
    _g = 0
    while(_g < h) 
      y = _g
      _g+=1
      target = 0
      at = 0
      begin
        _g1 = 0
        while(_g1 < w) 
          x = _g1
          _g1+=1
          if sizes != nil 
            spaces = target - at
            begin
              _g2 = 0
              while(_g2 < spaces) 
                i = _g2
                _g2+=1
                txts.push(" ")
                at+=1
              end
            end
          end
          if x > 0 
            txts.push(@codes["minor"])
            txts.push(@delim)
            txts.push(@codes["done"])
          end
          txts.push(self.get_text(x,y,true))
          if sizes != nil 
            bit = self.get_text(x,y,false)
            at += bit.length
            target += sizes[x]
          end
        end
      end
      txts.push("\r\n")
    end
  end
  @t = nil
  @v = nil
  @csv = nil
  @codes = nil
  txts.join("")
end

Protected Instance Methods

get_text(x,y,color) click to toggle source
# File lib/lib/coopy/terminal_diff_render.rb, line 113
def get_text(x,y,color)
  val = @t.get_cell(x,y)
  cell = ::Coopy::DiffRender.render_cell(@t,@v,x,y)
  if color && @diff 
    code = nil
    code = @codes[cell.category] if cell.category != nil
    if cell.category_given_tr != nil 
      code_tr = @codes[cell.category_given_tr]
      code = code_tr if code_tr != nil
    end
    if code != nil 
      separator = nil
      if @use_glyphs 
        separator = cell.pretty_separator
      else 
        separator = cell.separator
      end
      if cell.rvalue != nil 
        val = _hx_str(@codes["remove"]) + _hx_str(cell.lvalue) + _hx_str(@codes["modify"]) + _hx_str(separator) + _hx_str(@codes["add"]) + _hx_str(cell.rvalue) + _hx_str(@codes["done"])
        val = _hx_str(@codes["conflict"]) + _hx_str(cell.pvalue) + _hx_str(@codes["modify"]) + _hx_str(separator) + _hx_str(val.to_s) if cell.pvalue != nil
      else 
        if @use_glyphs 
          val = cell.pretty_value
        else 
          val = cell.value
        end
        val = _hx_str(code) + _hx_str(val.to_s) + _hx_str(@codes["done"])
      end
    end
  elsif color && !@diff 
    val = _hx_str(@codes["header"]) + _hx_str(val.to_s) + _hx_str(@codes["done"]) if y == 0
  elsif @use_glyphs 
    val = cell.pretty_value
  else 
    val = cell.value
  end
  @csv.render_cell(@v,val)
end
pick_sizes(t) click to toggle source
# File lib/lib/coopy/terminal_diff_render.rb, line 152
def pick_sizes(t)
  w = t.get_width
  h = t.get_height
  v = t.get_cell_view
  csv = ::Coopy::Csv.new
  sizes = Array.new
  row = -1
  total = w - 1
  begin
    _g = 0
    while(_g < w) 
      x = _g
      _g+=1
      m = 0
      m2 = 0
      mmax = 0
      mmostmax = 0
      mmin = -1
      begin
        _g1 = 0
        while(_g1 < h) 
          y = _g1
          _g1+=1
          txt = self.get_text(x,y,false)
          row = y if txt == "@@" && row == -1 && @diff
          row = y if row == -1 && !@diff
          len = txt.length
          mmin = len if y == row
          m += len
          m2 += len * len
          mmax = len if len > mmax
        end
      end
      mean = m / h
      stddev = Math.sqrt(m2 / h - mean * mean)
      most = (mean + stddev * 2 + 0.5).to_i
      begin
        _g11 = 0
        while(_g11 < h) 
          y1 = _g11
          _g11+=1
          txt1 = self.get_text(x,y1,false)
          len1 = txt1.length
          if len1 <= most 
            mmostmax = len1 if len1 > mmostmax
          end
        end
      end
      full = mmax
      most = mmostmax
      if mmin != -1 
        most = mmin if most < mmin
      end
      most = full if @wide_columns
      sizes.push(most)
      total += most
    end
  end
  return nil if total > 130
  sizes
end