@@ -51,7 +51,8 @@ var diffview = {
51
51
var baseTextName = params . baseTextName ? params . baseTextName : "Base Text" ;
52
52
var newTextName = params . newTextName ? params . newTextName : "New Text" ;
53
53
var contextSize = params . contextSize ;
54
- var inline = ( params . viewType == 0 || params . viewType == 1 ) ? params . viewType : 0 ;
54
+ var inline = ( params . viewType == 0 || params . viewType >= 1 ) ? params . viewType : 0 ;
55
+ var wordlevel = params . viewType > 1 ;
55
56
56
57
if ( baseTextLines == null )
57
58
throw "Cannot build diff view; baseTextLines is not defined." ;
@@ -78,6 +79,13 @@ var diffview = {
78
79
e . appendChild ( document . createTextNode ( text ) ) ;
79
80
return e ;
80
81
}
82
+
83
+ function ctel ( name , clazz , node ) {
84
+ var e = document . createElement ( name ) ;
85
+ e . className = clazz ;
86
+ e . appendChild ( node ) ;
87
+ return e ;
88
+ }
81
89
82
90
var tdata = document . createElement ( "thead" ) ;
83
91
var node = document . createElement ( "tr" ) ;
@@ -123,7 +131,13 @@ var diffview = {
123
131
row . appendChild ( telt ( "th" , tidx2 == null ? "" : ( tidx2 + 1 ) . toString ( ) ) ) ;
124
132
row . appendChild ( ctelt ( "td" , change , textLines [ tidx != null ? tidx : tidx2 ] . replace ( / \t / g, "\u00a0\u00a0\u00a0\u00a0" ) ) ) ;
125
133
}
126
-
134
+
135
+ function addCellsNode ( row , tidx , tidx2 , node , change ) {
136
+ row . appendChild ( telt ( "th" , tidx == null ? "" : ( tidx + 1 ) . toString ( ) ) ) ;
137
+ row . appendChild ( telt ( "th" , tidx2 == null ? "" : ( tidx2 + 1 ) . toString ( ) ) ) ;
138
+ row . appendChild ( ctel ( "td" , change , node ) ) ;
139
+ }
140
+
127
141
for ( var idx = 0 ; idx < opcodes . length ; idx ++ ) {
128
142
code = opcodes [ idx ] ;
129
143
change = code [ 0 ] ;
@@ -164,8 +178,46 @@ var diffview = {
164
178
addCellsInline ( node , null , n ++ , newTextLines , change ) ;
165
179
} else if ( change == "replace" ) {
166
180
botrows . push ( node2 = document . createElement ( "tr" ) ) ;
181
+ if ( wordlevel ) {
182
+ var baseTextLine = baseTextLines [ b ] ;
183
+ var newTextLine = newTextLines [ n ] ;
184
+ var wordrule = / ( [ ^ \S ] + | [ a - z A - Z 0 - 9 _ - ] + | .) (?: (? ! < ) [ ^ \S ] ) ? / ;
185
+ var bw = baseTextLine . split ( wordrule ) ;
186
+ var nw = newTextLine . split ( wordrule ) ;
187
+ var wsm = new difflib . SequenceMatcher ( bw , nw ) ;
188
+ var wopcodes = wsm . get_opcodes ( ) ;
189
+ var bnode = document . createElement ( 'span' ) ;
190
+ var nnode = document . createElement ( 'span' ) ;
191
+ for ( var k = 0 ; k < wopcodes . length ; k ++ ) {
192
+ var wcode = wopcodes [ k ] ;
193
+ var wchange = wcode [ 0 ] ;
194
+ var wb = wcode [ 1 ] ;
195
+ var wbe = wcode [ 2 ] ;
196
+ var wn = wcode [ 3 ] ;
197
+ var wne = wcode [ 4 ] ;
198
+ var wcnt = Math . max ( wbe - wb , wne - wn ) ;
199
+
200
+ for ( var m = 0 ; m < wcnt ; m ++ ) {
201
+ if ( wchange == "insert" ) {
202
+ nnode . appendChild ( ctelt ( "ins" , "diff" , nw [ wn ++ ] ) ) ;
203
+ } else if ( wchange == "replace" ) {
204
+ if ( wb < wbe ) bnode . appendChild ( ctelt ( "del" , "diff" , bw [ wb ++ ] ) ) ;
205
+ if ( wn < wne ) nnode . appendChild ( ctelt ( "ins" , "diff" , nw [ wn ++ ] ) ) ;
206
+ } else if ( wchange == "delete" ) {
207
+ bnode . appendChild ( ctelt ( "del" , "diff" , bw [ wb ++ ] ) ) ;
208
+ } else {
209
+ // equal
210
+ bnode . appendChild ( ctelt ( "span" , wchange , bw [ wb ] ) ) ;
211
+ nnode . appendChild ( ctelt ( "span" , wchange , bw [ wb ++ ] ) ) ;
212
+ }
213
+ }
214
+ }
215
+ if ( b < be ) addCellsNode ( node , b ++ , null , bnode , "delete" ) ;
216
+ if ( n < ne ) addCellsNode ( node2 , null , n ++ , nnode , "insert" ) ;
217
+ } else {
167
218
if ( b < be ) addCellsInline ( node , b ++ , null , baseTextLines , "delete" ) ;
168
219
if ( n < ne ) addCellsInline ( node2 , null , n ++ , newTextLines , "insert" ) ;
220
+ }
169
221
} else if ( change == "delete" ) {
170
222
addCellsInline ( node , b ++ , null , baseTextLines , change ) ;
171
223
} else {
0 commit comments