@@ -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