@@ -375,34 +375,40 @@ function badPos(pos, bad) { if (bad) pos.bad = true; return pos }
375375function domTextBetween ( cm , from , to , fromLine , toLine ) {
376376 let text = "" , closing = false , lineSep = cm . doc . lineSeparator ( )
377377 function recognizeMarker ( id ) { return marker => marker . id == id }
378+ function close ( ) {
379+ if ( closing ) {
380+ text += lineSep
381+ closing = false
382+ }
383+ }
384+ function addText ( str ) {
385+ if ( str ) {
386+ close ( )
387+ text += str
388+ }
389+ }
378390 function walk ( node ) {
379391 if ( node . nodeType == 1 ) {
380392 let cmText = node . getAttribute ( "cm-text" )
381393 if ( cmText != null ) {
382- if ( cmText == "" ) text += node . textContent . replace ( / \u200b / g, "" )
383- else text += cmText
394+ addText ( cmText || node . textContent . replace ( / \u200b / g, "" ) )
384395 return
385396 }
386397 let markerID = node . getAttribute ( "cm-marker" ) , range
387398 if ( markerID ) {
388399 let found = cm . findMarks ( Pos ( fromLine , 0 ) , Pos ( toLine + 1 , 0 ) , recognizeMarker ( + markerID ) )
389400 if ( found . length && ( range = found [ 0 ] . find ( ) ) )
390- text += getBetween ( cm . doc , range . from , range . to ) . join ( lineSep )
401+ addText ( getBetween ( cm . doc , range . from , range . to ) . join ( lineSep ) )
391402 return
392403 }
393404 if ( node . getAttribute ( "contenteditable" ) == "false" ) return
405+ let isBlock = / ^ ( p r e | d i v | p ) $ / i. test ( node . nodeName )
406+ if ( isBlock ) close ( )
394407 for ( let i = 0 ; i < node . childNodes . length ; i ++ )
395408 walk ( node . childNodes [ i ] )
396- if ( / ^ ( p r e | d i v | p ) $ / i. test ( node . nodeName ) )
397- closing = true
409+ if ( isBlock ) closing = true
398410 } else if ( node . nodeType == 3 ) {
399- let val = node . nodeValue
400- if ( ! val ) return
401- if ( closing ) {
402- text += lineSep
403- closing = false
404- }
405- text += val
411+ addText ( node . nodeValue )
406412 }
407413 }
408414 for ( ; ; ) {
0 commit comments