@@ -36,6 +36,9 @@ const WordCollapser = (function() {
3636 if ( c === 65 ) { // A
3737 listenForLeftWord ( ) ;
3838 }
39+ else if ( c === 83 ) { // S
40+ listenForUnjoin ( ) ;
41+ }
3942 else {
4043 cancel ( ) ;
4144 }
@@ -54,7 +57,7 @@ const WordCollapser = (function() {
5457 text = text . slice ( 0 , 12 ) + "…" + text . slice ( - 12 ) ;
5558 }
5659
57- let phrase = new Word ( text , leftWord . idx ) ;
60+ let phrase = new Word ( text , leftWord . idx , ' ' ) ;
5861
5962 let row = leftWord . row ;
6063
@@ -133,35 +136,46 @@ const WordCollapser = (function() {
133136 }
134137
135138 function unjoinWord ( word ) {
139+ let i = word . row . words . indexOf ( word ) ;
140+ let row = word . row ;
141+
136142 [ ] . splice . apply ( wordObjs , [ wordObjs . indexOf ( word ) , 1 ] . concat ( word . removedWords ) ) ;
137- [ ] . splice . apply ( word . row . words , [ word . row . words . indexOf ( word ) , 1 ] . concat ( word . removedWords ) ) ;
143+ [ ] . splice . apply ( row . words , [ i , 1 ] . concat ( word . removedWords ) ) ;
138144
139145 // set position of uncollapsed words
140146 const rowWidth = Config . svgWidth - Config . edgePadding * 2 ;
141147 let x = word . leftX ;
142- const y = word . underneathRect . y ( ) ;
148+ let y = word . underneathRect . y ( ) ;
143149 word . removedWords . forEach ( rw => {
144- rw . row = word . row ;
145- moveWordToNewPosition ( rw , x , y ) ;
146- x += rw . underneathRect . width ( ) + Config . wordPadding ;
150+ rw . row = row ;
151+ rw . leftX = - 1 ;
147152 rw . svg . show ( ) ;
148153 } ) ;
154+
149155 // rearrange remaining words on row
150- let i = word . row . words . indexOf ( word . removedWords [ word . removedWords . length - 1 ] ) + 1 ;
151- while ( word . row . words [ i ] ) {
152- if ( x <= word . row . words [ i ] . leftX ) {
156+ while ( row . words [ i ] ) {
157+ if ( x <= row . words [ i ] . leftX ) {
153158 break ;
154159 }
155- moveWordToNewPosition ( word . row . words [ i ] , x , y ) ;
156- x += word . row . words [ i ] . underneathRect . width ( ) + Config . wordPadding ;
160+ moveWordToNewPosition ( row . words [ i ] , x , y ) ;
161+ x += row . words [ i ] . underneathRect . width ( ) + Config . wordPadding ;
157162 if ( x > rowWidth ) {
158- if ( word . row . idx + 1 === rows . length ) { appendRow ( ) ; }
159- moveWordDownARow ( word . row . words [ i ] ) ;
163+ // move down a row
164+ if ( row . idx + 1 === rows . length ) { appendRow ( ) ; }
165+ let w = row . words [ i ] ;
166+ for ( let j = row . words . length - 1 ; j >= i ; -- j ) {
167+ moveWordDownARow ( row . words [ j ] ) ;
168+ }
169+ row = w . row ;
170+ x = w . leftX + w . underneathRect . width ( ) + Config . wordPadding ;
171+ y = w . underneathRect . y ( ) ;
172+ i = 1 ;
173+ }
174+ else {
175+ ++ i ;
160176 }
161- ++ i ;
162177 }
163178
164-
165179 // revert assigned references to word in link
166180 function revertLinkWordObject ( link ) {
167181 [ 'leftWord' , 'rightWord' , 'nearestConnectedMaxWord' , 'nearestConnectedMinWord' , 'rootMaxWord' , 'rootMinWord' ] . forEach ( prop => {
0 commit comments