@@ -42,7 +42,7 @@ function isMatch(left, right){
42
42
}
43
43
44
44
/**
45
- * Longest common subsequence
45
+ * Longest common subsequence (obverse)
46
46
* @param {Array } left
47
47
* @param {Array } right
48
48
* @param {Function } match
@@ -86,6 +86,45 @@ function LCS(left, right, match){
86
86
return lastLine . pop ( ) || [ ] ;
87
87
}
88
88
89
+ /**
90
+ * Longest common subsequence (reverse)
91
+ * @param {Array } left
92
+ * @param {Array } right
93
+ * @param {Function } match
94
+ * @returns {Array }
95
+ * @constructor
96
+ */
97
+ function LCS2 ( left , right , match ) {
98
+ var lastLine = [ ] ;
99
+ var currLine = [ ] ;
100
+ left . forEach ( function ( old ) {
101
+ right . forEach ( function ( cur , x ) {
102
+ if ( match ( old , cur ) ) {
103
+ var sequence = ( lastLine [ x - 1 ] || [ ] ) . slice ( 0 ) ;
104
+ sequence . push ( { l : old , r : cur } ) ;
105
+ currLine [ x ] = sequence ;
106
+ } else {
107
+ var lSeq = currLine [ x - 1 ] ;
108
+ var tSeq = lastLine [ x ] ;
109
+ if ( lSeq && tSeq ) {
110
+ if ( lSeq . length > tSeq . length ) {
111
+ currLine [ x ] = lSeq . slice ( 0 ) ;
112
+ } else {
113
+ currLine [ x ] = tSeq . slice ( 0 ) ;
114
+ }
115
+ } else if ( lSeq ) {
116
+ currLine [ x ] = lSeq . slice ( 0 ) ;
117
+ } else if ( tSeq ) {
118
+ currLine [ x ] = tSeq . slice ( 0 ) ;
119
+ }
120
+ }
121
+ } ) ;
122
+ lastLine = currLine ;
123
+ currLine = [ ] ;
124
+ } ) ;
125
+ return ( lastLine . pop ( ) || [ ] ) ;
126
+ }
127
+
89
128
/**
90
129
* diff change
91
130
* @param {Object } left
@@ -102,7 +141,7 @@ var diff = function(left, right, opt){
102
141
if ( left . style !== right . style ) {
103
142
change . type |= opt . changeType . STYLE ;
104
143
}
105
- LCS ( left . child , right . child , isMatch ) . forEach ( function ( node ) {
144
+ ( opt . priority === 'tail' ? LCS2 : LCS ) ( left . child , right . child , isMatch ) . forEach ( function ( node ) {
106
145
var old = node . l ;
107
146
var cur = node . r ;
108
147
cur . matched = old . matched = true ;
0 commit comments