@@ -11,11 +11,14 @@ import { SettingsManager, getData } from './settings';
11
11
import throttle = require( 'lodash.throttle' ) ;
12
12
import morphdom from 'morphdom' ;
13
13
14
- let documentVersion = 0 ;
15
14
let scrollDisabledCount = 0 ;
15
+
16
16
const marker = new ActiveLineMarker ( ) ;
17
17
const settings = new SettingsManager ( ) ;
18
18
19
+ let documentVersion = 0 ;
20
+ let documentResource = settings . settings . source ;
21
+
19
22
const vscode = acquireVsCodeApi ( ) ;
20
23
21
24
const originalState = vscode . getState ( ) ;
@@ -101,36 +104,85 @@ const onUpdateView = (() => {
101
104
} ;
102
105
} ) ( ) ;
103
106
104
-
105
107
window . addEventListener ( 'resize' , ( ) => {
106
108
scrollDisabledCount += 1 ;
107
109
updateScrollProgress ( ) ;
108
110
} , true ) ;
109
111
110
- window . addEventListener ( 'message' , event => {
111
- if ( settings . settings && event . data . source !== settings . settings . source ) {
112
- return ;
113
- }
112
+ window . addEventListener ( 'message' , async event => {
114
113
115
114
switch ( event . data . type ) {
116
115
case 'onDidChangeTextEditorSelection' :
117
- marker . onDidChangeTextEditorSelection ( event . data . line , documentVersion ) ;
118
- break ;
116
+ if ( event . data . source === documentResource ) {
117
+ marker . onDidChangeTextEditorSelection ( event . data . line , documentVersion ) ;
118
+ }
119
+ return ;
119
120
120
121
case 'updateView' :
121
- onUpdateView ( event . data . line ) ;
122
- break ;
122
+ if ( event . data . source === documentResource ) {
123
+ console . log ( 'updateView' , event . data . line ) ;
124
+ onUpdateView ( event . data . line ) ;
125
+ }
126
+ return ;
123
127
124
128
case 'updateContent' :
125
129
const root = document . querySelector ( '.markdown-body' ) ! ;
126
- morphdom ( root , event . data . content ) ;
130
+
131
+ const parser = new DOMParser ( ) ;
132
+ const newContent = parser . parseFromString ( event . data . content , 'text/html' ) ;
133
+
134
+ if ( event . data . source !== documentResource ) {
135
+ root . replaceWith ( newContent . querySelector ( '.markdown-body' ) ! ) ;
136
+ documentResource = event . data . source ;
137
+ } else {
138
+ const areEqual = ( a : Element , b : Element ) : boolean => {
139
+ if ( a . isEqualNode ( b ) ) {
140
+ return true ;
141
+ }
142
+
143
+ if ( a . tagName !== b . tagName || a . textContent !== b . textContent ) {
144
+ return false ;
145
+ }
146
+
147
+ const aChildren = Array . from ( a . children ) ;
148
+ const bChildren = Array . from ( b . children ) ;
149
+
150
+ return aChildren . length === bChildren . length && aChildren . every ( ( x , i ) => areEqual ( x , bChildren [ i ] ) ) ;
151
+ } ;
152
+
153
+ const newRoot = newContent . querySelector ( '.markdown-body' ) ! ;
154
+
155
+ // Move styles to head
156
+ // This prevents an ugly flash of unstyled content
157
+ const styles = newRoot . querySelectorAll ( 'link' ) ;
158
+
159
+ for ( const style of styles ) {
160
+ style . remove ( ) ;
161
+ }
162
+ newRoot . prepend ( ...styles ) ;
163
+
164
+ morphdom ( root , newRoot , {
165
+ childrenOnly : true ,
166
+ onBeforeElUpdated : ( fromEl , toEl ) => {
167
+ if ( areEqual ( fromEl , toEl ) ) {
168
+ fromEl . setAttribute ( 'data-line' , toEl . getAttribute ( 'data-line' ) ! ) ;
169
+ return false ;
170
+ }
171
+
172
+ return true ;
173
+ }
174
+ } ) ;
175
+ }
176
+
127
177
++ documentVersion ;
128
178
129
179
window . dispatchEvent ( new CustomEvent ( 'vscode.markdown.updateContent' ) ) ;
130
180
break ;
131
181
}
132
182
} , false ) ;
133
183
184
+
185
+
134
186
document . addEventListener ( 'dblclick' , event => {
135
187
if ( ! settings . settings . doubleClickToSwitchToEditor ) {
136
188
return ;
@@ -189,7 +241,7 @@ document.addEventListener('click', event => {
189
241
190
242
window . addEventListener ( 'scroll' , throttle ( ( ) => {
191
243
updateScrollProgress ( ) ;
192
-
244
+ console . log ( 'scroll' ) ;
193
245
if ( scrollDisabledCount > 0 ) {
194
246
scrollDisabledCount -= 1 ;
195
247
} else {
0 commit comments