@@ -311,6 +311,27 @@ function hasShallowDifference(
311311 return false ;
312312}
313313
314+ function nodesStructurallyEqual ( beforeNode : Node , afterNode : Node ) : boolean {
315+ if ( beforeNode . type !== afterNode . type ) return false ;
316+ if ( beforeNode . type === "text" && afterNode . type === "text" ) {
317+ return beforeNode . value === afterNode . value ;
318+ }
319+ if ( beforeNode . type === "element" && afterNode . type === "element" ) {
320+ if ( beforeNode . tagName !== afterNode . tagName ) return false ;
321+ if ( ! shallowAttributesEqual ( beforeNode , afterNode ) ) return false ;
322+ if ( beforeNode . children . length !== afterNode . children . length ) return false ;
323+ for ( let i = 0 ; i < beforeNode . children . length ; i ++ ) {
324+ const beforeChild = beforeNode . children [ i ] ! ;
325+ const afterChild = afterNode . children [ i ] ! ;
326+ if ( ! nodesStructurallyEqual ( beforeChild , afterChild ) ) {
327+ return false ;
328+ }
329+ }
330+ return true ;
331+ }
332+ return false ;
333+ }
334+
314335function renderHtmlDiffInternal ( args : {
315336 beforeHtml : string ;
316337 afterHtml : string ;
@@ -355,6 +376,9 @@ function renderHtmlDiffInternal(args: {
355376 getAttribute ( beforeNode , "data-diff-mode" ) ;
356377
357378 if ( mode === "element" ) {
379+ if ( nodesStructurallyEqual ( beforeNode , afterNode ) ) {
380+ continue ;
381+ }
358382 const clone = cloneElement ( beforeNode ) ;
359383 setDiffStatus ( clone , "removed" ) ;
360384 setAttribute ( clone , "contenteditable" , "false" ) ;
0 commit comments