class Coopy::DiffRender

Attributes

open[RW]
pretty_arrows[RW]
section[RW]
td_close[RW]
td_open[RW]
text_to_insert[RW]

protected - in ruby this doesn't play well with static/inline methods

Public Class Methods

examine_cell(x,y,view,raw,vcol,vrow,vcorner,cell,offset = 0) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 184
def DiffRender.examine_cell(x,y,view,raw,vcol,vrow,vcorner,cell,offset = 0)
  nested = view.is_hash(raw)
  cell.category = ""
  cell.category_given_tr = ""
  cell.separator = ""
  cell.pretty_separator = ""
  cell.conflicted = false
  cell.updated = false
  cell.meta = cell.pvalue = cell.lvalue = cell.rvalue = nil
  cell.value = raw
  cell.pretty_value = cell.value
  vrow = "" if vrow == nil
  vcol = "" if vcol == nil
  if vrow.length >= 3 && vrow[0] == "@" && vrow[1] != "@" 
    idx = vrow.index("@",1 || 0) || -1
    if idx >= 0 
      cell.meta = vrow[1,idx - 1]
      vrow = vrow[idx + 1,vrow.length]
      cell.category = "meta"
    end
  end
  removed_column = false
  cell.category = "move" if vrow == ":"
  cell.category = "index" if vrow == "" && offset == 1 && y == 0
  if (vcol.index("+++",nil || 0) || -1) >= 0 
    cell.category_given_tr = cell.category = "add"
  elsif (vcol.index("---",nil || 0) || -1) >= 0 
    cell.category_given_tr = cell.category = "remove"
    removed_column = true
  end
  if vrow == "!" 
    cell.category = "spec"
  elsif vrow == "@@" 
    cell.category = "header"
  elsif vrow == "..." 
    cell.category = "gap"
  elsif vrow == "+++" 
    cell.category = "add" if !removed_column
  elsif vrow == "---" 
    cell.category = "remove"
  elsif (vrow.index("->",nil || 0) || -1) >= 0 
    if !removed_column 
      tokens = vrow.split("!")
      full = vrow
      part = tokens[1]
      part = full if part == nil
      str = view.to_s(cell.value)
      str = "" if str == nil
      if nested || (str.index(part,nil || 0) || -1) >= 0 
        cat = "modify"
        div = part
        if part != full 
          if nested 
            cell.conflicted = view.hash_exists(raw,"theirs")
          else 
            cell.conflicted = (str.index(full,nil || 0) || -1) >= 0
          end
          if cell.conflicted 
            div = full
            cat = "conflict"
          end
        end
        cell.updated = true
        cell.separator = div
        cell.pretty_separator = div
        if nested 
          if cell.conflicted 
            tokens = [view.hash_get(raw,"before"),view.hash_get(raw,"ours"),view.hash_get(raw,"theirs")]
          else 
            tokens = [view.hash_get(raw,"before"),view.hash_get(raw,"after")]
          end
        else 
          cell.pretty_value = view.to_s(cell.pretty_value)
          cell.pretty_value = "" if cell.pretty_value == nil
          if cell.pretty_value == div 
            tokens = ["",""]
          else 
            tokens = cell.pretty_value.split(div)
          end
        end
        pretty_tokens = tokens
        if tokens.length >= 2 
          pretty_tokens[0] = ::Coopy::DiffRender.mark_spaces(tokens[0],tokens[1])
          pretty_tokens[1] = ::Coopy::DiffRender.mark_spaces(tokens[1],tokens[0])
        end
        if tokens.length >= 3 
          ref = pretty_tokens[0]
          pretty_tokens[0] = ::Coopy::DiffRender.mark_spaces(ref,tokens[2])
          pretty_tokens[2] = ::Coopy::DiffRender.mark_spaces(tokens[2],ref)
        end
        cell.pretty_separator = [8594].pack("U")
        cell.pretty_value = pretty_tokens.join(cell.pretty_separator)
        cell.category_given_tr = cell.category = cat
        offset1 = nil
        if cell.conflicted 
          offset1 = 1
        else 
          offset1 = 0
        end
        cell.lvalue = tokens[offset1]
        cell.rvalue = tokens[offset1 + 1]
        cell.pvalue = tokens[0] if cell.conflicted
      end
    end
  end
  cell.category_given_tr = cell.category = "index" if x == 0 && offset > 0
end
mark_spaces(sl,sr) click to toggle source

protected - in ruby this doesn't play well with static/inline methods

# File lib/lib/coopy/diff_render.rb, line 294
def DiffRender.mark_spaces(sl,sr)
  return sl if sl == sr
  return sl if sl == nil || sr == nil
  slc = sl.gsub(" ","")
  src = sr.gsub(" ","")
  return sl if slc != src
  slo = String.new("")
  il = 0
  ir = 0
  while(il < sl.length) 
    cl = sl[il]
    cr = ""
    cr = sr[ir] if ir < sr.length
    if cl == cr 
      slo += cl
      il+=1
      ir+=1
    elsif cr == " " 
      ir+=1
    else 
      slo += [9251].pack("U")
      il+=1
    end
  end
  slo
end
new() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 7
def initialize
  @text_to_insert = Array.new
  @open = false
  @pretty_arrows = true
end
render_cell(tab,view,x,y) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 323
def DiffRender.render_cell(tab,view,x,y)
  cell = ::Coopy::CellInfo.new
  corner = view.to_s(tab.get_cell(0,0))
  off = nil
  if corner == "@:@" 
    off = 1
  else 
    off = 0
  end
  ::Coopy::DiffRender.examine_cell(x,y,view,tab.get_cell(x,y),view.to_s(tab.get_cell(x,off)),view.to_s(tab.get_cell(off,y)),corner,cell,off)
  cell
end

Public Instance Methods

begin_row(mode) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 54
def begin_row(mode)
  @td_open = "<td"
  @td_close = "</td>"
  row_class = ""
  if mode == "header" 
    @td_open = "<th"
    @td_close = "</th>"
  end
  row_class = mode
  tr = "<tr>"
  tr = "<tr class=\"" + _hx_str(row_class) + "\">" if row_class != ""
  self.insert(tr)
end
begin_table() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 34
def begin_table 
  self.insert("<table>\n")
  @section = nil
end
complete_html() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 177
def complete_html 
  @text_to_insert.insert(0,"<!DOCTYPE html>\n<html>\n<head>\n<meta charset='utf-8'>\n<style TYPE='text/css'>\n")
  @text_to_insert.insert(1,self.sample_css)
  @text_to_insert.insert(2,"</style>\n</head>\n<body>\n<div class='highlighter'>\n")
  @text_to_insert.push("</div>\n</body>\n</html>\n")
end
end_row() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 80
def end_row 
  self.insert("</tr>\n")
end
end_table() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 84
def end_table 
  self.set_section(nil)
  self.insert("</table>\n")
end
html() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 91
def html 
  @text_to_insert.join("")
end
insert(str) click to toggle source

protected - in ruby this doesn't play well with static/inline methods

# File lib/lib/coopy/diff_render.rb, line 30
def insert(str)
  @text_to_insert.push(str)
end
insert_cell(txt,mode) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 68
def insert_cell(txt,mode)
  cell_decorate = ""
  cell_decorate = " class=\"" + _hx_str(mode) + "\"" if mode != ""
  self.insert(_hx_str(@td_open) + _hx_str(cell_decorate) + ">")
  if txt != nil 
    self.insert(txt)
  else 
    self.insert("null")
  end
  self.insert(@td_close)
end
render(tab) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 99
def render(tab)
  tab = ::Coopy::Coopy.tablify(tab)
  return self if tab.get_width == 0 || tab.get_height == 0
  render = self
  render.begin_table
  change_row = -1
  cell = ::Coopy::CellInfo.new
  view = tab.get_cell_view
  corner = view.to_s(tab.get_cell(0,0))
  off = nil
  if corner == "@:@" 
    off = 1
  else 
    off = 0
  end
  if off > 0 
    return self if tab.get_width <= 1 || tab.get_height <= 1
  end
  begin
    _g1 = 0
    _g = tab.get_height
    while(_g1 < _g) 
      row = _g1
      _g1+=1
      open = false
      txt = view.to_s(tab.get_cell(off,row))
      txt = "" if txt == nil
      ::Coopy::DiffRender.examine_cell(off,row,view,txt,"",txt,corner,cell,off)
      row_mode = cell.category
      change_row = row if row_mode == "spec"
      if row_mode == "header" || row_mode == "spec" || row_mode == "index" || row_mode == "meta" 
        self.set_section("head")
      else 
        self.set_section("body")
      end
      render.begin_row(row_mode)
      begin
        _g3 = 0
        _g2 = tab.get_width
        while(_g3 < _g2) 
          c = _g3
          _g3+=1
          ::Coopy::DiffRender.examine_cell(c,row,view,tab.get_cell(c,row),((change_row >= 0) ? view.to_s(tab.get_cell(c,change_row)) : ""),txt,corner,cell,off)
          render.insert_cell(((@pretty_arrows) ? cell.pretty_value : cell.value),cell.category_given_tr)
        end
      end
      render.end_row
    end
  end
  render.end_table
  self
end
render_tables(tabs) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 152
def render_tables(tabs)
  order = tabs.get_order
  self.render(tabs.one) if order.length == 0 || tabs.has_ins_del
  begin
    _g1 = 1
    _g = order.length
    while(_g1 < _g) 
      i = _g1
      _g1+=1
      name = order[i]
      tab = tabs.get(name)
      next if tab.get_height <= 1
      self.insert("<h3>")
      self.insert(name)
      self.insert("</h3>\n")
      self.render(tab)
    end
  end
  self
end
sample_css() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 173
def sample_css 
  ".highlighter .add { \n  background-color: #7fff7f;\n}\n\n.highlighter .remove { \n  background-color: #ff7f7f;\n}\n\n.highlighter td.modify { \n  background-color: #7f7fff;\n}\n\n.highlighter td.conflict { \n  background-color: #f00;\n}\n\n.highlighter .spec { \n  background-color: #aaa;\n}\n\n.highlighter .move { \n  background-color: #ffa;\n}\n\n.highlighter .null { \n  color: #888;\n}\n\n.highlighter table { \n  border-collapse:collapse;\n}\n\n.highlighter td, .highlighter th {\n  border: 1px solid #2D4068;\n  padding: 3px 7px 2px;\n}\n\n.highlighter th, .highlighter .header, .highlighter .meta {\n  background-color: #aaf;\n  font-weight: bold;\n  padding-bottom: 4px;\n  padding-top: 5px;\n  text-align:left;\n}\n\n.highlighter tr.header th {\n  border-bottom: 2px solid black;\n}\n\n.highlighter tr.index td, .highlighter .index, .highlighter tr.header th.index {\n  background-color: white;\n  border: none;\n}\n\n.highlighter .gap {\n  color: #888;\n}\n\n.highlighter td {\n  empty-cells: show;\n}\n"
end
set_section(str) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 39
def set_section(str)
  return if str == @section
  if @section != nil 
    self.insert("</t")
    self.insert(@section)
    self.insert(">\n")
  end
  @section = str
  if @section != nil 
    self.insert("<t")
    self.insert(@section)
    self.insert(">\n")
  end
end
to_s() click to toggle source
# File lib/lib/coopy/diff_render.rb, line 95
def to_s 
  self.html
end
use_pretty_arrows(flag) click to toggle source
# File lib/lib/coopy/diff_render.rb, line 24
def use_pretty_arrows(flag)
  @pretty_arrows = flag
end