~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/static/javascript/diff.js

  • Committer: Robey Pointer
  • Date: 2006-12-29 02:24:03 UTC
  • Revision ID: robey@lag.net-20061229022403-cgijbxwz76ud0dvu
do side-by-side diff on the revision page, making it the default.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
var unified = true;
2
 
 
3
 
function make_unified(chunk) {
4
 
  var pending_added = [];
5
 
  function flush_adds(before) {
6
 
    for (var i = 0; i < pending_added.length; i++) {
7
 
      before.ancestor().insertBefore(pending_added[i], before);
8
 
    }
9
 
    pending_added.length = 0;
10
 
  }
11
 
  chunk.get('children').filter(".pseudorow").each(
12
 
    function (line) {
13
 
      if (line.hasClass("context-row")) {
14
 
        flush_adds(line);
15
 
        line.removeChild(line.query('.code'));
16
 
      }
17
 
      else if (line.hasClass("both-row")) {
18
 
        var added_line = line.create('<div class="pseudorow insert-row"><div class="lineNumber first">&nbsp;</div><div class="clear">&nbsp;</div></div>');
19
 
        var clear = added_line.query('.clear');
20
 
        added_line.insertBefore(line.query('.lineNumber.second'), clear);
21
 
        added_line.insertBefore(line.query('.code.insert'), clear);
22
 
        pending_added[pending_added.length] = added_line;
23
 
        line.insertBefore(line.create('<div class="lineNumber second">&nbsp;</div>'), line.query('.code.delete'));
24
 
        line.replaceClass("both-row", "delete-row");
25
 
      }
26
 
      else if (line.hasClass("insert-row")) {
27
 
        flush_adds(line);
28
 
        line.removeChild(line.query('.blank'));
29
 
      }
30
 
      else if (line.hasClass("delete-row")) {
31
 
        line.removeChild(line.query('.blank'));
32
 
        line.insertBefore(line.query('.lineNumber.second'), line.query('.code.delete'));
33
 
      }
34
 
    });
35
 
  flush_adds(null);
36
 
  chunk.replaceClass('sbs', 'unified');
37
 
}
38
 
 
39
 
function make_sbs(chunk) {
40
 
  var added = [];
41
 
  var removed = [];
42
 
  function clear_bufs(before) {
43
 
    if (!added.length && !removed.length) return;
44
 
    var common = Math.min(added.length, removed.length);
45
 
    for (var i = 0; i < common; i++) {
46
 
      var a = added[i];
47
 
      var r = removed[i];
48
 
      a.ancestor().removeChild(a);
49
 
      r.removeChild(r.query('.lineNumber.second'));
50
 
      r.insertBefore(a.query('.lineNumber.second'), r.query('.clear'));
51
 
      r.insertBefore(a.query('.code.insert'), r.query('.clear'));
52
 
      r.replaceClass('removed-row', 'both-row');
53
 
    }
54
 
    if (added.length > removed.length) {
55
 
      for (var j = common; j < added.length; j++) {
56
 
        a = added[j];
57
 
        a.insertBefore(a.create('<div class="blank">&nbsp;</div>'), a.query('.lineNumber.second'));
58
 
      }
59
 
    }
60
 
    else if (added.length < removed.length) {
61
 
      for (var j = common; j < removed.length; j++) {
62
 
        r = removed[j];
63
 
        r.insertBefore(r.query('.code.delete'), r.query('.lineNumber.second'));
64
 
        r.insertBefore(r.create('<div class="blank">&nbsp;</div>'), r.query('.clear'));
65
 
      }
66
 
    }
67
 
    added.length = 0;
68
 
    removed.length = 0;
69
 
  }
70
 
  chunk.get('children').filter(".pseudorow").each(
71
 
    function (line) {
72
 
      if (line.hasClass("context-row")) {
73
 
        clear_bufs(line);
74
 
        line.insertBefore(line.query('.code').cloneNode(true), line.query(".second"));
75
 
      }
76
 
      else if (line.hasClass("insert-row")) {
77
 
        added[added.length] = line;
78
 
      }
79
 
      else if (line.hasClass("delete-row")) {
80
 
        removed[removed.length] = line;
81
 
      }
82
 
    });
83
 
  clear_bufs(null);
84
 
  chunk.replaceClass('unified', 'sbs');
85
 
 
86
 
}
87
 
 
88
 
function toggle_unified_sbs(event) {
89
 
  event.preventDefault();
90
 
  var pts = Y.all(".pseudotable");
91
 
  if (unified) {
92
 
    pts && pts.each(make_sbs);
93
 
    unified = false;
94
 
    Y.get("#toggle_unified_sbs").set('innerHTML', "Show unified diffs");
95
 
  }
96
 
  else {
97
 
    pts && pts.each(make_unified);
98
 
    unified = true;
99
 
    Y.get("#toggle_unified_sbs").set('innerHTML', "Show diffs side-by-side");
100
 
  }
101
 
}
102
 
 
103
 
Y.on("click", toggle_unified_sbs, '#toggle_unified_sbs');
104
 
 
105
 
function toggle_expand_all_revisionview(action)
106
 
{
107
 
  var diffs = Y.all('.diff');
108
 
  if (diffs == null) return;
109
 
  diffs.each(
110
 
    function(item, i)
111
 
    {
112
 
      var collapsable = item.collapsable;
113
 
      if(action == 'close')
114
 
      {
115
 
        Y.get('#expand_all').setStyle('display','block');
116
 
        Y.get('#collapse_all').setStyle('display','none');
117
 
        collapsable.close();
118
 
      }
119
 
      else if(action == 'open')
120
 
      {
121
 
        Y.get('#expand_all').setStyle('display','none');
122
 
        Y.get('#collapse_all').setStyle('display','block');
123
 
        collapsable.open();
124
 
      }
125
 
    });
126
 
}
127
 
 
128
 
Y.on(
129
 
  'click',
130
 
  function (event) {
131
 
    event.preventDefault();
132
 
    toggle_expand_all_revisionview('open');
133
 
  },
134
 
  '#expand_all a'
135
 
);
136
 
 
137
 
Y.on(
138
 
  'click',
139
 
  function (event) {
140
 
    event.preventDefault();
141
 
    toggle_expand_all_revisionview('close');
142
 
  },
143
 
  '#collapse_all a'
144
 
);
145
 
 
146
 
function node_process(node) {
147
 
  if (!unified) {
148
 
    node.get('children').filter('.pseudotable').each(make_sbs);
149
 
  }
150
 
}
151
 
 
152
 
function zoom_to_diff (path) {
153
 
  var collapsable = Y.get('#' + path_to_id[path]).collapsable;
154
 
  if (!collapsable.is_open) {
155
 
    collapsable.open(
156
 
      function () {
157
 
        window.location.hash = '#' + path;
158
 
      });
159
 
  }
160
 
}
161
 
 
162
 
Y.on(
163
 
  "domready", function () {
164
 
    Y.all(".show_if_js").removeClass("show_if_js");
165
 
    if (!specific_path) {
166
 
      Y.all("#list-files a").on(
167
 
        'click',
168
 
        function (e) {
169
 
          e.preventDefault();
170
 
          var path = decodeURIComponent(e.target.get('href').split('#')[1]);
171
 
          window.location.hash = '#' + path;
172
 
          zoom_to_diff(path);
173
 
        });
174
 
    }
175
 
    var diffs = Y.all('.diff');
176
 
    if (diffs == null) return;
177
 
    diffs.each(
178
 
      function(item, i)
179
 
      {
180
 
        var source_url = null;
181
 
        if (!specific_path)
182
 
          source_url = global_path + '+filediff/' + link_data[item.get('id')];
183
 
        item.query('.the-link').on(
184
 
          'click',
185
 
          function(e) {
186
 
            e.preventDefault();
187
 
            collapsable.toggle();
188
 
          });
189
 
        var collapsable = new Collapsable(
190
 
          {
191
 
            expand_icon: item.query('.expand_diff'),
192
 
            open_node: item.query('.diffinfo'),
193
 
            close_node: null,
194
 
            source: source_url,
195
 
            is_open: specific_path != null,
196
 
            loading: item.query('.loading'),
197
 
            node_process: node_process
198
 
          });
199
 
       item.collapsable=collapsable;
200
 
       });
201
 
    if (window.location.hash && !specific_path) {
202
 
      zoom_to_diff(window.location.hash.substring(1));
203
 
    }
204
 
  });