@@ -332,7 +332,7 @@ export class Overlay<T = string> implements Printable, Stateful {
332332 hash = this . refreshSlices ( hash , txt . savedSlices ) ;
333333 hash = this . refreshSlices ( hash , txt . extraSlices ) ;
334334 hash = this . refreshSlices ( hash , txt . localSlices ) ;
335- // if (!slicesOnly) this.computeSplitTextHashes();
335+ if ( ! slicesOnly ) this . computeSplitTextHashes ( ) ;
336336 return ( this . hash = hash ) ;
337337 }
338338
@@ -355,7 +355,7 @@ export class Overlay<T = string> implements Printable, Stateful {
355355 if ( positionMoved ) this . delSlice ( slice , tuple ) ;
356356 else return ;
357357 }
358- tuple = this . insSlice ( slice ) ;
358+ tuple = slice instanceof MarkerSlice ? this . insMarker ( slice ) : this . insSlice ( slice ) ;
359359 this . slices . set ( slice , tuple ) ;
360360 } ) ;
361361 if ( slices . size ( ) < sliceSet . size ) {
@@ -371,6 +371,54 @@ export class Overlay<T = string> implements Printable, Stateful {
371371 return state ;
372372 }
373373
374+ private insSlice ( slice : Slice < T > ) : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] {
375+ console . log ( 'ins slice' , slice + '' )
376+ const x0 = slice . start ;
377+ const x1 = slice . end ;
378+ const [ start , isStartNew ] = this . upsertPoint ( x0 ) ;
379+ const [ end , isEndNew ] = this . upsertPoint ( x1 ) ;
380+ start . refs . push ( new OverlayRefSliceStart ( slice ) ) ;
381+ end . refs . push ( new OverlayRefSliceEnd ( slice ) ) ;
382+ if ( isStartNew ) {
383+ const beforeStartPoint = prev ( start ) ;
384+ if ( beforeStartPoint ) start . layers . push ( ...beforeStartPoint . layers ) ;
385+ }
386+ if ( isEndNew ) {
387+ const beforeEndPoint = prev ( end ) ;
388+ if ( beforeEndPoint ) end . layers . push ( ...beforeEndPoint . layers ) ;
389+ }
390+ let curr : OverlayPoint < T > | undefined = start ;
391+ do curr . addLayer ( slice ) ; while ( ( curr = next ( curr ) ) && ( curr !== end ) ) ;
392+ const isCollapsed = x0 . cmp ( x1 ) === 0 ;
393+ if ( isCollapsed ) start . addMarker ( slice ) ;
394+ return [ start , end ] ;
395+ }
396+
397+ private insMarker ( slice : MarkerSlice < T > ) : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] {
398+ const point = this . mPoint ( slice , Anchor . Before ) ;
399+ const pivot = this . insPoint ( point ) ;
400+ if ( ! pivot ) {
401+ point . refs . push ( slice ) ;
402+ const prevPoint = prev ( point ) ;
403+ if ( prevPoint ) point . layers . push ( ...prevPoint . layers ) ;
404+ }
405+ return [ point , point ] ;
406+ }
407+
408+ private delSlice ( slice : Slice < T > , [ start , end ] : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] ) : void {
409+ this . slices . delete ( slice ) ;
410+ let curr : OverlayPoint < T > | undefined = start ;
411+ do {
412+ curr . removeLayer ( slice ) ;
413+ curr . removeMarker ( slice ) ;
414+ curr = next ( curr ) ;
415+ } while ( curr && curr !== end ) ;
416+ start . removeRef ( slice ) ;
417+ end . removeRef ( slice ) ;
418+ if ( ! start . refs . length ) this . delPoint ( start ) ;
419+ if ( ! end . refs . length && start !== end ) this . delPoint ( end ) ;
420+ }
421+
374422 /**
375423 * Retrieve an existing {@link OverlayPoint} or create a new one, inserted
376424 * in the tree, sorted by spatial dimension.
@@ -407,62 +455,6 @@ export class Overlay<T = string> implements Printable, Stateful {
407455 this . root = remove ( this . root , point ) ;
408456 }
409457
410- private insMarker ( slice : MarkerSlice < T > ) : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] {
411- const point = this . mPoint ( slice , Anchor . Before ) ;
412- const pivot = this . insPoint ( point ) ;
413- if ( ! pivot ) {
414- point . refs . push ( slice ) ;
415- const prevPoint = prev ( point ) ;
416- if ( prevPoint ) point . layers . push ( ...prevPoint . layers ) ;
417- }
418- return [ point , point ] ;
419- }
420-
421- private insSlice ( slice : Slice < T > ) : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] {
422- if ( slice instanceof MarkerSlice ) return this . insMarker ( slice ) ;
423- const txt = this . txt ;
424- const str = txt . str ;
425- let startPoint = slice . start ;
426- let endPoint = slice . end ;
427- const [ start , isStartNew ] = this . upsertPoint ( startPoint ) ;
428- const [ end , isEndNew ] = this . upsertPoint ( endPoint ) ;
429- start . refs . push ( new OverlayRefSliceStart ( slice ) ) ;
430- end . refs . push ( new OverlayRefSliceEnd ( slice ) ) ;
431- if ( isStartNew ) {
432- const beforeStartPoint = prev ( start ) ;
433- if ( beforeStartPoint ) start . layers . push ( ...beforeStartPoint . layers ) ;
434- }
435- if ( isEndNew ) {
436- const beforeEndPoint = prev ( end ) ;
437- if ( beforeEndPoint ) end . layers . push ( ...beforeEndPoint . layers ) ;
438- }
439- const isCollapsed = startPoint . cmp ( endPoint ) === 0 ;
440- let curr : OverlayPoint < T > | undefined = start ;
441- while ( curr !== end && curr ) {
442- curr . addLayer ( slice ) ;
443- curr = next ( curr ) ;
444- }
445- if ( ! isCollapsed ) {
446- } else {
447- start . addMarker ( slice ) ;
448- }
449- return [ start , end ] ;
450- }
451-
452- private delSlice ( slice : Slice < T > , [ start , end ] : [ start : OverlayPoint < T > , end : OverlayPoint < T > ] ) : void {
453- this . slices . delete ( slice ) ;
454- let curr : OverlayPoint < T > | undefined = start ;
455- do {
456- curr . removeLayer ( slice ) ;
457- curr . removeMarker ( slice ) ;
458- curr = next ( curr ) ;
459- } while ( curr && curr !== end ) ;
460- start . removeRef ( slice ) ;
461- end . removeRef ( slice ) ;
462- if ( ! start . refs . length ) this . delPoint ( start ) ;
463- if ( ! end . refs . length && start !== end ) this . delPoint ( end ) ;
464- }
465-
466458 // ---------------------------------------------------------------- Printable
467459
468460 public toString ( tab : string = '' ) : string {
0 commit comments