11var SourceDiff = SourceDiff || { } ;
22
33SourceDiff . LineDiff = function ( ) {
4- var added = [ ] ;
5- var deleted = [ ] ;
6- var common = [ ] ;
4+ var _added = [ ] ;
5+ var _deleted = [ ] ;
6+ var _common = [ ] ;
77
88 var addCommon = function ( leftPosition , rightPosition , length ) {
9- common . unshift ( {
9+ _common . unshift ( {
1010 leftPosition : leftPosition ,
1111 leftEndPosition : leftPosition + length - 1 ,
1212 rightPosition : rightPosition ,
@@ -15,13 +15,13 @@ SourceDiff.LineDiff = function() {
1515 } ;
1616
1717 var addDelete = function ( position , length ) {
18- deleted . unshift ( {
18+ _deleted . unshift ( {
1919 position : position ,
2020 endPosition : position + length - 1 } ) ;
2121 } ;
2222
2323 var addInsert = function ( position , length ) {
24- added . unshift ( {
24+ _added . unshift ( {
2525 position : position ,
2626 endPosition : position + length - 1 } ) ;
2727 } ;
@@ -38,66 +38,61 @@ SourceDiff.LineDiff = function() {
3838 } ;
3939
4040 var cleanUp = function ( ) {
41- mergeAdjacent ( added ) ;
42- mergeAdjacent ( deleted ) ;
43-
44- for ( var i = 0 ; i < common . length ; i ++ ) {
45- if ( i + 1 < common . length
46- && common [ i ] . leftEndPosition + 1 === common [ i + 1 ] . leftPosition
47- && common [ i ] . rightEndPosition + 1 === common [ i + 1 ] . rightPosition ) {
48- common [ i ] . leftEndPosition = common [ i + 1 ] . leftEndPosition ;
49- common [ i ] . rightEndPosition = common [ i + 1 ] . rightEndPosition ;
50- common . splice ( i + 1 , 1 ) ;
51- i -- ;
52- }
53- }
41+ mergeAdjacent ( _added ) ;
42+ mergeAdjacent ( _deleted ) ;
43+ mergeAdjacentCommon ( ) ;
5444
55- var cont = true ;
56- while ( cont ) {
57- cont = false ;
58- for ( var i = 0 ; i < common . length ; i ++ ) {
59- var equalityLength = commonLength ( common [ i ] ) ;
45+ do {
46+ var merged = false ;
47+ for ( var i = 0 ; i < _common . length ; i ++ ) {
48+ var equalityLength = commonLength ( _common [ i ] ) ;
6049
61- var leftDelete = findEditWithEndingPosition ( deleted , common [ i ] . leftPosition - 1 ) ;
62- var rightDelete = findEditWithPosition ( deleted , common [ i ] . leftEndPosition + 1 ) ;
50+ var leftDelete = findEditWithEndingPosition ( _deleted , _common [ i ] . leftPosition - 1 ) ;
51+ var rightDelete = findEditWithPosition ( _deleted , _common [ i ] . leftEndPosition + 1 ) ;
6352
64- var leftAdd = findEditWithEndingPosition ( added , common [ i ] . rightPosition - 1 ) ;
65- var rightAdd = findEditWithPosition ( added , common [ i ] . rightEndPosition + 1 ) ;
53+ var leftAdd = findEditWithEndingPosition ( _added , _common [ i ] . rightPosition - 1 ) ;
54+ var rightAdd = findEditWithPosition ( _added , _common [ i ] . rightEndPosition + 1 ) ;
6655 if ( editLength ( leftDelete ) + editLength ( leftAdd ) >= equalityLength
6756 && editLength ( rightDelete ) + editLength ( rightAdd ) >= equalityLength ) {
68- cont = true ;
69- if ( leftDelete ) {
70- if ( rightDelete ) {
71- leftDelete . endPosition = rightDelete . endPosition ;
72- removeEdit ( deleted , rightDelete ) ;
73- } else {
74- leftDelete . endPosition = common [ i ] . leftEndPosition ;
75- }
57+ merged = true ;
58+ if ( leftDelete && rightDelete ) {
59+ leftDelete . endPosition = rightDelete . endPosition ;
60+ removeEdit ( _deleted , rightDelete ) ;
61+ } else if ( leftDelete ) {
62+ leftDelete . endPosition = _common [ i ] . leftEndPosition ;
63+ } else if ( rightDelete ) {
64+ rightDelete . position = _common [ i ] . leftPosition ;
7665 } else {
77- if ( rightDelete ) {
78- rightDelete . position = common [ i ] . leftPosition ;
79- } else {
80- addEdit ( deleted , common [ i ] . leftPosition , common [ i ] . leftEndPosition ) ;
81- }
66+ addEdit ( _deleted , _common [ i ] . leftPosition , _common [ i ] . leftEndPosition ) ;
8267 }
83- if ( leftAdd ) {
84- if ( rightAdd ) {
85- leftAdd . endPosition = rightAdd . endPosition ;
86- removeEdit ( added , rightAdd ) ;
87- } else {
88- leftAdd . endPosition = common [ i ] . rightEndPosition ;
89- }
68+
69+ if ( leftAdd && rightAdd ) {
70+ leftAdd . endPosition = rightAdd . endPosition ;
71+ removeEdit ( _added , rightAdd ) ;
72+ } else if ( leftAdd ) {
73+ leftAdd . endPosition = _common [ i ] . rightEndPosition ;
74+ } else if ( rightAdd ) {
75+ rightAdd . position = _common [ i ] . rightPosition ;
9076 } else {
91- if ( rightAdd ) {
92- rightAdd . position = common [ i ] . rightPosition ;
93- } else {
94- addEdit ( added , common [ i ] . rightPosition , common [ i ] . rightEndPosition ) ;
95- }
77+ addEdit ( _added , _common [ i ] . rightPosition , _common [ i ] . rightEndPosition ) ;
9678 }
9779
98- common . splice ( i , 1 ) ;
80+ _common . splice ( i , 1 ) ;
9981 }
10082 }
83+ } while ( merged )
84+ } ;
85+
86+ var mergeAdjacentCommon = function ( ) {
87+ for ( var i = 0 ; i < _common . length ; i ++ ) {
88+ if ( i + 1 < _common . length
89+ && _common [ i ] . leftEndPosition + 1 === _common [ i + 1 ] . leftPosition
90+ && _common [ i ] . rightEndPosition + 1 === _common [ i + 1 ] . rightPosition ) {
91+ _common [ i ] . leftEndPosition = _common [ i + 1 ] . leftEndPosition ;
92+ _common [ i ] . rightEndPosition = _common [ i + 1 ] . rightEndPosition ;
93+ _common . splice ( i + 1 , 1 ) ;
94+ i -- ;
95+ }
10196 }
10297 } ;
10398
@@ -159,8 +154,8 @@ SourceDiff.LineDiff = function() {
159154 addInsert : addInsert ,
160155 addCommon : addCommon ,
161156 cleanUp : cleanUp ,
162- added : added ,
163- deleted : deleted ,
164- common : common
157+ added : _added ,
158+ deleted : _deleted ,
159+ common : _common
165160 } ;
166161} ;
0 commit comments