@@ -83,11 +83,42 @@ highlighter
83
83
} ) ;
84
84
85
85
/**
86
- * attach hooks
86
+ * avoid re-highlighting the existing selection
87
87
*/
88
- highlighter . hooks . Render . SelectedNodes . tap (
89
- ( id , selectedNodes ) => selectedNodes . filter ( n => n . $node . textContent )
90
- ) ;
88
+ function getIds ( selected ) {
89
+ if ( ! selected || ! selected . $node || ! selected . $node . parentNode ) {
90
+ return [ ] ;
91
+ }
92
+ return [
93
+ highlighter . getIdByDom ( selected . $node . parentNode ) ,
94
+ ...highlighter . getExtraIdByDom ( selected . $node . parentNode )
95
+ ] . filter ( i => i )
96
+ }
97
+ function getIntersection ( arrA , arrB ) {
98
+ const record = { } ;
99
+ const intersection = [ ] ;
100
+ arrA . forEach ( i => record [ i ] = true ) ;
101
+ arrB . forEach ( i => record [ i ] && intersection . push ( i ) && ( record [ i ] = false ) ) ;
102
+ return intersection ;
103
+ }
104
+ highlighter . hooks . Render . SelectedNodes . tap ( ( id , selectedNodes ) => {
105
+ selectedNodes = selectedNodes . filter ( n => n . $node . textContent ) ;
106
+ if ( selectedNodes . length === 0 ) {
107
+ return [ ] ;
108
+ }
109
+
110
+ const candidates = selectedNodes . slice ( 1 ) . reduce (
111
+ ( left , selected ) => getIntersection ( left , getIds ( selected ) ) ,
112
+ getIds ( selectedNodes [ 0 ] )
113
+ ) ;
114
+ for ( let i = 0 ; i < candidates . length ; i ++ ) {
115
+ if ( highlighter . getDoms ( candidates [ i ] ) . length === selectedNodes . length ) {
116
+ return [ ] ;
117
+ }
118
+ }
119
+
120
+ return selectedNodes ;
121
+ } ) ;
91
122
92
123
highlighter . hooks . Serialize . Restore . tap (
93
124
source => log ( 'Serialize.Restore hook -' , source )
0 commit comments