@@ -3906,6 +3906,7 @@ window.CodeMirror = (function() {
39063906 }
39073907 if ( cm ) signalLater ( cm , "markerCleared" , cm , this ) ;
39083908 if ( withOp ) endOperation ( cm ) ;
3909+ if ( this . parent ) this . parent . clear ( ) ;
39093910 } ;
39103911
39113912 TextMarker . prototype . find = function ( bothSides ) {
@@ -3963,7 +3964,7 @@ window.CodeMirror = (function() {
39633964 if ( doc . cm && ! doc . cm . curOp ) return operation ( doc . cm , markText ) ( doc , from , to , options , type ) ;
39643965
39653966 var marker = new TextMarker ( doc , type ) ;
3966- if ( options ) copyObj ( options , marker ) ;
3967+ if ( options ) copyObj ( options , marker , false ) ;
39673968 if ( posLess ( to , from ) || posEq ( from , to ) && marker . clearWhenEmpty !== false )
39683969 return marker ;
39693970 if ( marker . replacedWith ) {
@@ -4023,10 +4024,8 @@ window.CodeMirror = (function() {
40234024 function SharedTextMarker ( markers , primary ) {
40244025 this . markers = markers ;
40254026 this . primary = primary ;
4026- for ( var i = 0 , me = this ; i < markers . length ; ++ i ) {
4027+ for ( var i = 0 ; i < markers . length ; ++ i )
40274028 markers [ i ] . parent = this ;
4028- on ( markers [ i ] , "clear" , function ( ) { me . clear ( ) ; } ) ;
4029- }
40304029 }
40314030 CodeMirror . SharedTextMarker = SharedTextMarker ;
40324031 eventMixin ( SharedTextMarker ) ;
@@ -4057,6 +4056,37 @@ window.CodeMirror = (function() {
40574056 return new SharedTextMarker ( markers , primary ) ;
40584057 }
40594058
4059+ function findSharedMarkers ( doc ) {
4060+ return doc . findMarks ( Pos ( doc . first , 0 ) , doc . clipPos ( Pos ( doc . lastLine ( ) ) ) ,
4061+ function ( m ) { return m . parent ; } ) ;
4062+ }
4063+
4064+ function copySharedMarkers ( doc , markers ) {
4065+ for ( var i = 0 ; i < markers . length ; i ++ ) {
4066+ var marker = markers [ i ] , pos = marker . find ( ) ;
4067+ var mFrom = doc . clipPos ( pos . from ) , mTo = doc . clipPos ( pos . to ) ;
4068+ if ( cmp ( mFrom , mTo ) ) {
4069+ var subMark = markText ( doc , mFrom , mTo , marker . primary , marker . primary . type ) ;
4070+ marker . markers . push ( subMark ) ;
4071+ subMark . parent = marker ;
4072+ }
4073+ }
4074+ }
4075+
4076+ function detachSharedMarkers ( markers ) {
4077+ for ( var i = 0 ; i < markers . length ; i ++ ) {
4078+ var marker = markers [ i ] , linked = [ marker . primary . doc ] ; ;
4079+ linkedDocs ( marker . primary . doc , function ( d ) { linked . push ( d ) ; } ) ;
4080+ for ( var j = 0 ; j < marker . markers . length ; j ++ ) {
4081+ var subMarker = marker . markers [ j ] ;
4082+ if ( indexOf ( linked , subMarker . doc ) == - 1 ) {
4083+ subMarker . parent = null ;
4084+ marker . markers . splice ( j -- , 1 ) ;
4085+ }
4086+ }
4087+ }
4088+ }
4089+
40604090 // TEXTMARKER SPANS
40614091
40624092 function getMarkedSpanFor ( spans , marker ) {
@@ -5078,7 +5108,7 @@ window.CodeMirror = (function() {
50785108 }
50795109 return markers ;
50805110 } ,
5081- findMarks : function ( from , to ) {
5111+ findMarks : function ( from , to , filter ) {
50825112 from = clipPos ( this , from ) ; to = clipPos ( this , to ) ;
50835113 var found = [ ] , lineNo = from . line ;
50845114 this . iter ( from . line , to . line + 1 , function ( line ) {
@@ -5087,7 +5117,8 @@ window.CodeMirror = (function() {
50875117 var span = spans [ i ] ;
50885118 if ( ! ( lineNo == from . line && from . ch > span . to ||
50895119 span . from == null && lineNo != from . line ||
5090- lineNo == to . line && span . from > to . ch ) )
5120+ lineNo == to . line && span . from > to . ch ) &&
5121+ ( ! filter || filter ( span . marker ) ) )
50915122 found . push ( span . marker . parent || span . marker ) ;
50925123 }
50935124 ++ lineNo ;
@@ -5145,6 +5176,7 @@ window.CodeMirror = (function() {
51455176 if ( options . sharedHist ) copy . history = this . history ;
51465177 ( this . linked || ( this . linked = [ ] ) ) . push ( { doc : copy , sharedHist : options . sharedHist } ) ;
51475178 copy . linked = [ { doc : this , isParent : true , sharedHist : options . sharedHist } ] ;
5179+ copySharedMarkers ( copy , findSharedMarkers ( this ) ) ;
51485180 return copy ;
51495181 } ,
51505182 unlinkDoc : function ( other ) {
@@ -5154,6 +5186,7 @@ window.CodeMirror = (function() {
51545186 if ( link . doc != other ) continue ;
51555187 this . linked . splice ( i , 1 ) ;
51565188 other . unlinkDoc ( this ) ;
5189+ detachSharedMarkers ( findSharedMarkers ( this ) ) ;
51575190 break ;
51585191 }
51595192 // If the histories were shared, split them again
@@ -5634,9 +5667,11 @@ window.CodeMirror = (function() {
56345667 return inst ;
56355668 }
56365669
5637- function copyObj ( obj , target ) {
5670+ function copyObj ( obj , target , overwrite ) {
56385671 if ( ! target ) target = { } ;
5639- for ( var prop in obj ) if ( obj . hasOwnProperty ( prop ) ) target [ prop ] = obj [ prop ] ;
5672+ for ( var prop in obj )
5673+ if ( obj . hasOwnProperty ( prop ) && ( overwrite !== false || ! target . hasOwnProperty ( prop ) ) )
5674+ target [ prop ] = obj [ prop ] ;
56405675 return target ;
56415676 }
56425677
0 commit comments