@@ -51,7 +51,8 @@ var diffview = {
5151 var baseTextName = params . baseTextName ? params . baseTextName : "Base Text" ;
5252 var newTextName = params . newTextName ? params . newTextName : "New Text" ;
5353 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 ;
5556
5657 if ( baseTextLines == null )
5758 throw "Cannot build diff view; baseTextLines is not defined." ;
@@ -78,6 +79,13 @@ var diffview = {
7879 e . appendChild ( document . createTextNode ( text ) ) ;
7980 return e ;
8081 }
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+ }
8189
8290 var tdata = document . createElement ( "thead" ) ;
8391 var node = document . createElement ( "tr" ) ;
@@ -123,7 +131,13 @@ var diffview = {
123131 row . appendChild ( telt ( "th" , tidx2 == null ? "" : ( tidx2 + 1 ) . toString ( ) ) ) ;
124132 row . appendChild ( ctelt ( "td" , change , textLines [ tidx != null ? tidx : tidx2 ] . replace ( / \t / g, "\u00a0\u00a0\u00a0\u00a0" ) ) ) ;
125133 }
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+
127141 for ( var idx = 0 ; idx < opcodes . length ; idx ++ ) {
128142 code = opcodes [ idx ] ;
129143 change = code [ 0 ] ;
@@ -164,8 +178,46 @@ var diffview = {
164178 addCellsInline ( node , null , n ++ , newTextLines , change ) ;
165179 } else if ( change == "replace" ) {
166180 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 {
167218 if ( b < be ) addCellsInline ( node , b ++ , null , baseTextLines , "delete" ) ;
168219 if ( n < ne ) addCellsInline ( node2 , null , n ++ , newTextLines , "insert" ) ;
220+ }
169221 } else if ( change == "delete" ) {
170222 addCellsInline ( node , b ++ , null , baseTextLines , change ) ;
171223 } else {
0 commit comments